- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 6 个顶点,如果用户拖动鼠标,例如从顶点 1 到顶点 2,用户应该能够创建一条线。如果用户释放鼠标并且鼠标没有最终到达以下位置之一顶点,它不会创建一条线。
我该怎么做?
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.Ellipse2D;
import javax.swing.JComponent;
import javax.swing.JFrame;
public class DijkstraUI extends JComponent implements MouseListener {
String zero = "0";
String one = "1";
String two = "2";
String three = "3";
String four = "4";
String five = "5";
Ellipse2D zeroOval = new Ellipse2D.Double(50,120,50,50);
Ellipse2D oneOval = new Ellipse2D.Double(150,45,50,50);
Ellipse2D twoOval = new Ellipse2D.Double(150,150,50,50);
Ellipse2D threeOval = new Ellipse2D.Double(260,120,50,50);
Ellipse2D fourOval = new Ellipse2D.Double(100,240,50,50);
Ellipse2D fiveOval = new Ellipse2D.Double(200,250,50,50);
Point pointStart = null;
Point pointEnd = null;
public DijkstraUI(){
}
public static void main(String args[]) {
JFrame frame = new JFrame("Dijkstra: Finding the shortest path");
DijkstraUI dj = new DijkstraUI();
frame.getContentPane().add(dj);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 400);
frame.setVisible(true);
frame.setResizable(false);
}
@Override
public void paint(Graphics g){
Graphics2D g2d = (Graphics2D) g;
g2d.setPaint(Color.WHITE);
g2d.fill(zeroOval);
g2d.fill(oneOval);
g2d.fill(twoOval);
g2d.fill(threeOval);
g2d.fill(fourOval);
g2d.fill(fiveOval);
g2d.setPaint(Color.BLACK);
g2d.drawString(zero,70,150);
g2d.drawString(one,170,75);
g2d.drawString(two,170,180);
g2d.drawString(three,280,150);
g2d.drawString(four,120,270);
g2d.drawString(five,220,280);
super.paint(g);
if(pointStart != null)
g2d.drawLine(pointStart.x, pointStart.y, pointEnd.x, pointEnd.y);
}
@Override
public void mouseClicked(MouseEvent e) {
if((e.getButton() == 1) || zeroOval.contains(e.getX(), e.getY())){
System.out.print("test");
}
}
@Override
public void mousePressed(MouseEvent e) {
pointStart = e.getPoint();
}
@Override
public void mouseReleased(MouseEvent e) {
pointStart = null;
}
public void mouseMoved(MouseEvent e) {
pointEnd = e.getPoint();
}
public void mouseDragged(MouseEvent e) {
pointEnd = e.getPoint();
repaint();
}
@Override
public void mouseEntered(MouseEvent e) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void mouseExited(MouseEvent e) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}
最佳答案
花了一段时间,但我画出了你的台词。
我对您的代码进行了以下主要更改。
我把JFrame创建代码放在一个Runnable中,并用Runnable调用SwingUtilities的invokeLater方法,将Swing组件的创建和使用放在Event Dispatch thread上。 。 Oracle 和我坚持所有 Swing 应用程序都在事件调度线程上启动。
我创建了一个 GUI 模型类 DijkstraModel。 DijkstraModel 类包含椭圆列表和直线列表。
我创建了一个椭圆类 MyEllipse,用于保存 Ellipse2D 信息和椭圆标签。每当您发现自己试图保持两个列表同步时,请考虑创建一个 Java getter/setter 类来保存字段。
我创建了一个线类 MyLine 来保存线端点。
由于 GUI 模型,paintComponent 方法得到了简化。我添加了对 super PaintComponent 方法的调用。
我创建了一个单独的 MouseListener 类 MyMouseListener,因为当它是单独的时,在静态上下文中处理监听器会更容易。
这是修改后的代码。
package com.ggl.testing;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class DijkstraUI extends JComponent {
private static final long serialVersionUID = 8838700175925828779L;
private static MyMouseListener listener;
private DijkstraModel model;
public DijkstraUI() {
this.model = new DijkstraModel();
listener = new MyMouseListener(this, model);
}
public static void main(String args[]) {
Runnable runnable = new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("Dijkstra: Finding the shortest path");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DijkstraUI dj = new DijkstraUI();
dj.addMouseListener(listener);
frame.getContentPane().add(dj);
frame.setSize(400, 400);
frame.setResizable(false);
frame.setVisible(true);
}
};
SwingUtilities.invokeLater(runnable);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
for (MyEllipse ellipse : model.getEllipseList()) {
g2d.setPaint(Color.WHITE);
Ellipse2D ellipse2d = ellipse.getEllipse();
g2d.fill(ellipse2d);
g2d.setPaint(Color.BLACK);
g2d.drawString(ellipse.getLabel(),
(int) ellipse2d.getCenterX() - 5,
(int) ellipse2d.getCenterY() + 6);
}
for (MyLine myLine : model.getLineList()) {
g2d.setPaint(Color.BLUE);
g2d.drawLine(myLine.getFromPoint().x, myLine.getFromPoint().y,
myLine.getToPoint().x, myLine.getToPoint().y);
}
}
public class MyMouseListener implements MouseListener {
private JComponent component;
private DijkstraModel model;
private Point fromPoint;
public MyMouseListener(JComponent component, DijkstraModel model) {
this.component = component;
this.model = model;
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
Point p = e.getPoint();
Point2D p2d = new Point2D.Double((double) p.x, (double) p.y);
p = getCenterPoint(p2d);
if (p.x >= 0) {
fromPoint = p;
}
}
@Override
public void mouseReleased(MouseEvent e) {
Point p = e.getPoint();
Point2D p2d = new Point2D.Double((double) p.x, (double) p.y);
p = getCenterPoint(p2d);
if (p.x >= 0) {
model.addMyLine(new MyLine(fromPoint, p));
component.repaint();
}
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
private Point getCenterPoint(Point2D mousePoint) {
for (MyEllipse ellipse : model.getEllipseList()) {
Ellipse2D ellipse2d = ellipse.getEllipse();
if (ellipse2d.contains(mousePoint)) {
Point p = new Point((int) ellipse2d.getCenterX(),
(int) ellipse2d.getCenterY());
return p;
}
}
return new Point(-1, -1);
}
}
public class DijkstraModel {
private List<MyEllipse> ellipseList;
private List<MyLine> lineList;
public DijkstraModel() {
this.ellipseList = new ArrayList<>();
this.ellipseList.add(new MyEllipse("0", new Ellipse2D.Double(50,
120, 50, 50)));
this.ellipseList.add(new MyEllipse("1", new Ellipse2D.Double(150,
45, 50, 50)));
this.ellipseList.add(new MyEllipse("2", new Ellipse2D.Double(150,
150, 50, 50)));
this.ellipseList.add(new MyEllipse("3", new Ellipse2D.Double(260,
120, 50, 50)));
this.ellipseList.add(new MyEllipse("4", new Ellipse2D.Double(100,
240, 50, 50)));
this.ellipseList.add(new MyEllipse("5", new Ellipse2D.Double(200,
250, 50, 50)));
this.lineList = new ArrayList<>();
}
public List<MyEllipse> getEllipseList() {
return Collections.unmodifiableList(ellipseList);
}
public void addMyLine(MyLine myLine) {
this.lineList.add(myLine);
}
public List<MyLine> getLineList() {
return Collections.unmodifiableList(lineList);
}
}
public class MyEllipse {
private final String label;
private final Ellipse2D ellipse;
public MyEllipse(String label, Ellipse2D ellipse) {
this.label = label;
this.ellipse = ellipse;
}
public String getLabel() {
return label;
}
public Ellipse2D getEllipse() {
return ellipse;
}
}
public class MyLine {
private final Point fromPoint;
private final Point toPoint;
public MyLine(Point fromPoint, Point toPoint) {
this.fromPoint = fromPoint;
this.toPoint = toPoint;
}
public Point getFromPoint() {
return fromPoint;
}
public Point getToPoint() {
return toPoint;
}
}
}
关于java - 当用户从 a 点拖动到 b 点时在椭圆之间创建一条线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37299680/
在为 Web 应用程序用例图建模时,为用户可以拥有的每个角色创建一个角色是否更好?或拥有一个角色、用户和一个具有特权的矩阵? guest < 用户 < 版主 < 管理员 1: guest 、用户、版主
我无法使用 Elixir 连接到 Postgres: ** (Mix) The database for PhoenixChat.Repo couldn't be created: FATAL 28P
这个问题已经有答案了: Group by field name in Java (7 个回答) 已关闭 7 年前。 我必须编写一个需要 List 的方法并返回 Map> . User包含 Person
感谢您的帮助,首先我将显示代码: $dotaz = "Select * from customers JOIN contracts where customers.user_id ='".$_SESS
我只想向所有用户中的一个用户显示一个按钮。我尝试了 orderByKey() 但没有成功! 用户模型有 id 成员,我尝试使用 orderByChild("id") 但结果相同! 我什至尝试了以下技巧
我们在工作中从 MongoDB 切换到 Postgres,我正在建立一个 BDR 组。 在这一步,我正在考虑安全性并尽可能锁定。因此,我希望设置一个 replication 用户(角色)并让 BDR
export class UserListComponent implements OnInit{ users; constructor(private userService: UserS
我可以使用 Sonata User Bundle 将 FOS 包集成到 sonata Admin 包中。我的登录功能正常。现在我想添加 FOSUserBundle 中的更改密码等功能到 sonata
在 LinkedIn 中创建新应用程序时,我得到 4 个单独的代码: API key 秘钥 OAuth 用户 token OAuth 用户密码 我在 OAuth 流程中使用前两个。 的目的是什么?最后
所以..我几乎解决了所有问题。但现在我要处理另一个问题。我使用了这个连接字符串: SqlConnection con = new SqlConnection(@"Data Source=.\SQLEX
我有一组“用户”和一组“订单”。我想列出每个 user_id 的所有 order_id。 var users = { 0: { user_id: 111, us
我已经为我的Django应用创建了一个用户模型 class User(Model): """ The Authentication model. This contains the u
我被这个问题困住了,找不到解决方案。寻找一些方向。我正在用 laravel 开发一个新的项目,目前正致力于用户认证。我正在使用 Laravels 5.8 身份验证模块。 对密码恢复 View 做了一些
安装后我正在使用ansible配置几台计算机。 为此,我在机器上本地运行 ansible。安装中的“主要”用户通常具有不同的名称。我想将该用户用于诸如 become_user 之类的变量. “主要”用
我正在尝试制作一个运行 syncdb 的批处理文件来创建一个数据库文件,然后使用用户名“admin”和密码“admin”创建一个 super 用户。 到目前为止我的代码: python manage.
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 6 年前。 Improv
我已在 Azure 数据库服务器上设置异地复制。 服务器上运行的数据库之一具有我通过 SSMS 创建的登录名和用户: https://learn.microsoft.com/en-us/azure/s
我有一个 ionic 2 应用程序,正在使用 native FB Login 来检索名称/图片并将其保存到 NativeStorage。流程是我打开WelcomePage、登录并保存数据。从那里,na
这是我的用户身份验证方法: def user_login(request): if request.method == 'POST': username = request.P
我试图获取来自特定用户的所有推文,但是当我迭代在模板中抛出推文时,我得到“User”对象不可迭代 观看次数 tweets = User.objects.get(username__iexact='us
我是一名优秀的程序员,十分优秀!