java - GUI 中的鼠标拖动

标签 java swing user-interface drag-and-drop

我想要这段代码做的是当我按下并拖动屏幕上的红球时,我希望它随着鼠标光标移动,这段代码完成了这项工作并且部分取自 Sun 代码,所以假设提高效率,但如果我移动鼠标太快,它就会停止拖动鼠标...

我该如何克服这个问题?

    public class SwingPaintDemo3 {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI(); 
            }
        });
    }

    private static void createAndShowGUI() {
        JFrame f = new JFrame("Swing Paint Demo");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        f.add(new MyPanel());
        f.pack();
        f.setVisible(true);
    } 
}

class MyPanel extends JPanel {

    private int X = 0;
    private int Y = 0;
    private int R = 20;


         public MyPanel() {

        addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                if ((X<=e.getX() && X+R>=e.getX()) && ( Y<=e.getY() && Y+R>=e.getY())) moveVertex(e.getX(),e.getY());
            }
        });

        addMouseMotionListener(new MouseAdapter() {
            public void mouseDragged(MouseEvent e) {
                if ((X<=e.getX() && X+R>=e.getX()) && ( Y<=e.getY() && Y+R>=e.getY())) moveVertex(e.getX(),e.getY());
            }
        });

    }

    private void moveVertex(int x, int y) {
        int OFFSET = 1;
        if ((X!=x) || (Y!=y)) {
            repaint(X,Y,R+OFFSET,R+OFFSET);
            X=x-10;
            Y=y-10;
            repaint(X,Y,R+OFFSET,R+OFFSET);
        } 
    }


    public Dimension getPreferredSize() {
        return new Dimension(250,200);
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);       
        g.drawString("This is my custom Panel!",10,20);
        g.setColor(Color.RED);
        g.fillOval(X,Y,R,R);
        g.setColor(Color.BLACK);
        g.drawOval(X,Y,R,R);
    }  
}

最佳答案

出现此问题是因为事件处理程序 Java 的线程不够快,无法在您移动鼠标太快时处理 mouseDragged 事件。所以说你的鼠标指针在圆的中心,但是你在某些方向上移动得非常快,因此只有当鼠标在圆区域之外时才会触发 mouseDragged 事件,所以鼠标指针不是“与 cicle "了。

解决此问题的方法是使用具有 mouseButton 状态的 boolean 变量,如果在圆圈内单击鼠标,您将使圆圈随鼠标移动到任何地方!如果对方松开鼠标按钮,您的鼠标就会移动。

    class MyPanel extends JPanel {
        ...
        private boolean holdedInsideCircle = false;


           public MyPanel() {

               addMouseListener(new MouseAdapter() {
                   public void mousePressed(MouseEvent e) {
                    if ((X<=e.getX() && X+R>=e.getX()) && ( Y<=e.getY() && Y+R>=e.getY()))
                        moveVertex(e.getX(),e.getY());
                        holdedInsideCircle = true;
                   }
                   @Override
                   public void mouseReleased(MouseEvent e) {
                       //Doesn't matter where, if the mouse button is released
                       holdedInsideCircle = false;
                   }
               });


               addMouseMotionListener(new MouseAdapter() {
                   public void mouseDragged(MouseEvent e) {
                       //if ((X<=e.getX() && X+R>=e.getX()) && ( Y<=e.getY() && Y+R>=e.getY()))
                       if(holdedInsideCircle)
                           moveVertex(e.getX(),e.getY());
                   }
               });

        }

关于java - GUI 中的鼠标拖动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8716483/

相关文章:

user-interface - 在 Unity 中从像素坐标转换为 UI 坐标

Java 异常跟踪

java - 设置 zest 图形节点和连接的样式

java - 用于替换 ';' 之后的所有换行符的正则表达式

Java 未修饰的 jFrame 无法在 Windows 上运行

javascript - 如何创建类似滚动 UI 的 Google Plus?

user-interface - 微调警报 ionic

C# 开发人员学习 Java,可能会忽略的最大差异是什么?

java从另一个类打开一个框架

java - JMenuItem - 如何确定加速器是否调用了操作?