Java 通过鼠标拖动移动椭圆E2D

Java 通过鼠标拖动移动椭圆E2D,java,ellipse,Java,Ellipse,如标题所示,我想用鼠标拖动椭圆。我首先声明了椭圆,并通过ArrayLists绘制了它们(因为我有8个携带不同颜色信息的椭圆。四个是白色,另一个是红色)。我试着做我为矩形所做的: public void mousePressed(MouseEvent e) { x = e.getX(); y = e.getY(); } public void mouseDragged(MouseEvent e) { if(e.getSource()==MainPane) {

如标题所示,我想用鼠标拖动椭圆。我首先声明了椭圆,并通过
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: <ellipse name> of type Ellipse2D

因此,通过查看,很明显,
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<Ellipse2D> redEl = new ArrayList<Ellipse2D>();
    ArrayList<Ellipse2D> whiteEl = new ArrayList<Ellipse2D>();
    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<Ellipse2D> 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();
    }

}
导入java.awt.Color;
导入java.awt.Container;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Shape;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入java.awt.event.MouseMotionListener;
导入java.awt.geom.Ellipse2D;
导入java.awt.geom.Point2D;
导入java.awt.geom.Rectangle2D;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
公共类示例扩展JFrame实现MouseListener、MouseMotionListener{
JPanel主窗格;
容器内容窗格;
ArrayList redEl=新的ArrayList();
ArrayList Whitel=新的ArrayList();
Ellipse2D el1=新的Ellipse2D.Double(120,110,50,50);
Ellipse2D el2=新的Ellipse2D.Double(250,110,50,50);
Ellipse2D el3=新的Ellipse2D.Double(390、110、50、50);
Ellipse2D el4=新的Ellipse2D.Double(540,110,50,50);
Ellipse2D el5=新的Ellipse2D.Double(12039050);
Ellipse2D el6=新的Ellipse2D.Double(250,390,50,50);
Ellipse2D el7=新的Ellipse2D.Double(39039039050);
Ellipse2D el8=新的Ellipse2D.双精度(540,390,50,50);
int x;
int-y;
专用点2D。双偏移量;
公共样本(){
redEl.add(el1);
redEl.add(el2);
redEl.add(el3);
redEl.add(el4);
添加(el5);
添加(el6);
添加(el7);
添加(el8);
MainPane=newjpanel(){
公共组件(图形g){
超级组件(g);
图形2d g2=(图形2d)g;
用于(形状红色:红色){
g2.设置颜色(颜色为红色);
g2.填充(红色);
g2.绘制(红色);
}
用于(形状白色:白色){
g2.设置颜色(颜色为白色);
g2.填充(白色);
g2.绘制(白色);
}
}
};
主窗格。背景(颜色。黑色);
contentPane=this.getContentPane();
contentPane.add(主窗格);
MainPane.setLayout(空);
setVisible(真);
设置大小(701701);
可设置大小(假);
setLocationRelativeTo(空);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MainPane.addMouseListener(此);
MainPane.addMouseMotionListener(此);
}
所选的专用Ellipse2D=null;
公共无效鼠标按下(MouseEvent e){
x=e.getX();
y=e.getY();
List all=新阵列列表(redEl);
all.addAll(怀特尔);
for(省略号2d el:all){
if(el.包含(x,y)){
所选=el;
偏移量=新的点2d.Double(x-el.getX(),y-el.getY());
打破
}
}
}
公共无效mouseClicked(MouseEvent e){
选中=空;
}
公共无效MouseEvent(MouseEvent e){
}
公共无效鼠标事件(鼠标事件e){
}
公共无效mouseExited(MouseEvent e){
}
公共无效鼠标标记(鼠标事件e){
如果(已选择!=null){
double x=e.getX()-offSet.x;
双y=e.getY()-offSet.y;
矩形2D边界=选定。getBounds2D();
setFrame(新的矩形2D.Double(x,y,bounds.getWidth(),bounds.getHeight());
selected.setFrame(边界);
重新油漆();
}
}
public void mouseMoved(MouseEvent e){
}
公共静态void main(字符串参数[]){
新样本();
}
}

Ellipse2D
实际上并不公开
x
/
y
属性。你可以使用
setFrame
代替。谢谢:)我会尝试使用那种有效的方法!!非常感谢:)
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;
    }
}
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<Ellipse2D> redEl = new ArrayList<Ellipse2D>();
    ArrayList<Ellipse2D> whiteEl = new ArrayList<Ellipse2D>();
    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<Ellipse2D> 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();
    }

}