在鼠标拖动时移动Ellipse2D

因此,正如标题所述,我想在鼠标拖动时移动椭圆。 我先声明了椭圆并通过ArrayLists绘制它们(因为我有8个带有不同颜色信息的椭圆。四个是白色而另一个是红色)。 我尝试做我为矩形做的事情:

 public void mousePressed(MouseEvent e) { x = e.getX(); y = e.getY(); } public void mouseDragged(MouseEvent e) { if(e.getSource()==MainPane) { int dx = e.getX() - x; int dy = e.getY() - y; Point p = getLocation(); if(el1.getBounds().contains(x,y)) { el1.x += dx; el1.y += dy; } x += dx; y += dy; } } 

但这似乎不起作用。 它给了我一个错误

 cannot find symbol symbol: variable x location:  of type Ellipse2D 

我有点困惑,因为我已经阅读了文档,并且Ellipse2D.Double存在这样的变量。

这是一个MCVE:

 import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.awt.geom.Ellipse2D; import java.awt.geom.AffineTransform; import java.util.ArrayList; public class Sample extends JFrame implements MouseListener, MouseMotionListener { JPanel MainPane; Container contentPane; ArrayList redEl = new ArrayList(); ArrayList whiteEl = new ArrayList(); Ellipse2D el1 = new Ellipse2D.Double(120,110,50, 50); Ellipse2D el2 = new Ellipse2D.Double(250,110,50, 50); Ellipse2D el3 = new Ellipse2D.Double(390,110,50, 50); Ellipse2D el4 = new Ellipse2D.Double(540,110,50, 50); Ellipse2D el5 = new Ellipse2D.Double(120,390,50, 50); Ellipse2D el6 = new Ellipse2D.Double(250,390,50, 50); Ellipse2D el7 = new Ellipse2D.Double(390,390,50, 50); Ellipse2D el8 = new Ellipse2D.Double(540,390,50, 50); int x; int y; public Sample(){ redEl.add(el1); redEl.add(el2); redEl.add(el3); redEl.add(el4); whiteEl.add(el5); whiteEl.add(el6); whiteEl.add(el7); whiteEl.add(el8); MainPane = new JPanel() { public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; for (Shape red : redEl) { g2.setColor(Color.RED); g2.fill(red); g2.draw(red); } for (Shape white : whiteEl) { g2.setColor(Color.WHITE); g2.fill(white); g2.draw(white); } } }; MainPane.setBackground(Color.BLACK); contentPane = this.getContentPane(); contentPane.add(MainPane); MainPane.setLayout(null); setVisible(true); setSize(701, 701); setResizable(false); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); MainPane.addMouseListener(this); MainPane.addMouseMotionListener(this); } public void mousePressed(MouseEvent e) { x = e.getX(); y = e.getY(); } public void mouseClicked(MouseEvent e){} public void mouseReleased(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mouseDragged(MouseEvent e) { if(e.getSource() == MainPane) { int dx = e.getX() - x; int dy = e.getY() - y; if(el1.getBounds().contains(x,y)) { } x += dx; y += dy; } } public void mouseMoved(MouseEvent e){} public static void main(String args[]) { new Sample(); } } 

那么有替代算法还是我在语法中缺少一些东西? 我想知道解决方案。 谢谢。

更新:

通过MadProgrammer的建议解决了这个问题

这是我的mouseDragged方法。

 public void mouseDragged(MouseEvent e) { if(e.getSource()==MainPane) { int dx = e.getX() - x; int dy = e.getY() - y; Point p = getLocation(); if(el1.getBounds().contains(x,y)) { double xc = el1.getX(); double yc = el1.getY(); el1.setFrame(xc+=dx, yc+=dy, 50, 50); MainPane.repaint(); } x += dx; y += dy; } } 

因此,看看Ellipse2D的JavaDocs ,很明显Ellipse2D没有公开公开x / y属性。

相反,您必须使用其中一个setFrame方法。

这个例子是你的例子的一个小修改,它决定了当mousePressed事件发生时应该移动哪个椭圆,因为在我看来,在mouseDragged事件中做这个没有意义,除非你跳到拿起所有的椭圆。 它还定义了“点击”点和椭圆位置之间的偏移,因此它们不会“跳”到鼠标的位置。

 import java.awt.Color; import java.awt.Container; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Shape; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.geom.Ellipse2D; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.List; import javax.swing.JFrame; import javax.swing.JPanel; public class Sample extends JFrame implements MouseListener, MouseMotionListener { JPanel MainPane; Container contentPane; ArrayList redEl = new ArrayList(); ArrayList whiteEl = new ArrayList(); Ellipse2D el1 = new Ellipse2D.Double(120, 110, 50, 50); Ellipse2D el2 = new Ellipse2D.Double(250, 110, 50, 50); Ellipse2D el3 = new Ellipse2D.Double(390, 110, 50, 50); Ellipse2D el4 = new Ellipse2D.Double(540, 110, 50, 50); Ellipse2D el5 = new Ellipse2D.Double(120, 390, 50, 50); Ellipse2D el6 = new Ellipse2D.Double(250, 390, 50, 50); Ellipse2D el7 = new Ellipse2D.Double(390, 390, 50, 50); Ellipse2D el8 = new Ellipse2D.Double(540, 390, 50, 50); int x; int y; private Point2D.Double offSet; public Sample() { redEl.add(el1); redEl.add(el2); redEl.add(el3); redEl.add(el4); whiteEl.add(el5); whiteEl.add(el6); whiteEl.add(el7); whiteEl.add(el8); MainPane = new JPanel() { public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; for (Shape red : redEl) { g2.setColor(Color.RED); g2.fill(red); g2.draw(red); } for (Shape white : whiteEl) { g2.setColor(Color.WHITE); g2.fill(white); g2.draw(white); } } }; MainPane.setBackground(Color.BLACK); contentPane = this.getContentPane(); contentPane.add(MainPane); MainPane.setLayout(null); setVisible(true); setSize(701, 701); setResizable(false); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); MainPane.addMouseListener(this); MainPane.addMouseMotionListener(this); } private Ellipse2D selected = null; public void mousePressed(MouseEvent e) { x = e.getX(); y = e.getY(); List all = new ArrayList<>(redEl); all.addAll(whiteEl); for (Ellipse2D el : all) { if (el.contains(x, y)) { selected = el; offSet = new Point2D.Double(x - el.getX(), y - el.getY()); break; } } } public void mouseClicked(MouseEvent e) { selected = null; } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mouseDragged(MouseEvent e) { if (selected != null) { double x = e.getX() - offSet.x; double y = e.getY() - offSet.y; Rectangle2D bounds = selected.getBounds2D(); bounds.setFrame(new Rectangle2D.Double(x, y, bounds.getWidth(), bounds.getHeight())); selected.setFrame(bounds); repaint(); } } public void mouseMoved(MouseEvent e) { } public static void main(String args[]) { new Sample(); } }