当前位置: 首页 > 面试题库 >

在鼠标拖动时移动Ellipse2D

孟品
2023-03-14
问题内容

因此,正如标题所述,我想在鼠标拖动时移动椭圆。我先声明了椭圆并将其画出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.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<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;

    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;
    }
}

问题答案:

因此,通过浏览JavaDocs
forEllipse2D
很显然,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();
    }

}


 类似资料:
  • 任务是将物理光标移动到元素。 尝试以下操作: 和以下内容:

  • 问题内容: 我在JLabel中有一个图像。 我想要以下功能。 -我单击JLabel内部的位置(在图像上)。 -按下鼠标按钮,即可更改JLabel中图像的位置。(我将图片拖到JLabel中的不同位置) 好吧,这意味着在许多情况下,图片将被裁剪并且在视野之外。 请告诉我如何实现此功能? 什么是要添加到我的JLabel的正确事件监听器? 问题答案: 这是一个基本的例子… 通过将标签划分为3x3网格来工作

  • 有没有一种方法可以单击svg中的任何位置,并将元素捕捉到该位置,同时开始拖动? 我得到的最接近的是下面的代码。拖动圆可以工作,单击其他位置可以使圆移动到该位置,但我不知道如何在不释放鼠标并直接单击圆的情况下开始拖动。 更一般地说,如何在不直接与被拖动元素交互的情况下启动拖动行为? http://jsfiddle.net/Hj44M/1/

  • 我是 GraphStream 的新手,并且已经构建了一个最小的应用程序,其中 GraphStream 2.0 图形嵌入到 Swing 应用程序中。 在我的应用程序中,当我尝试拖动节点时,鼠标指针显然偏移了大约一半的面板大小(垂直和水平)。 这是代码: 下图显示了在中心拖动矩形节点时的鼠标指针位置(以红色包围)。 关于这个问题的原因有什么想法吗? 编辑: 下面是一个简短的GIF动画,显示了问题(显示

  • 因此,目前在伪代码中,我有: 我取代了dragbutton类中的鼠标运动/按压/释放功能。因此,我不能在那里引用新的。因此,dragbutton类中的无法获得,因为它是不同的self。我有什么办法让它起作用吗?谢了。

  • 我在JavaFX中创建了一个小的绘画程序,并且有了一个圆形创建工具。目前,我可以正确地画圆,但与我的其他工具不同,我看不到正在创建的圆(即,当我拖动鼠标时)。只有当我松开鼠标时,我才能看到圆(以正确的尺寸绘制)。我试图在拖动时添加一个< code>strokeOval()方法,但是它创建了一个奇怪的“泪珠”状的圆。我什么都试过了,有人能帮忙吗? 这是我的代码: 上面的代码正确创建了圆,但在我释放鼠