java用鼠标移动组件

标签 java swing drag-and-drop awt mouselistener

我试图通过简单地添加鼠标监听器并使用 java.awt.ComponentsetLocation 函数来使任何组件可拖动。我开始使用 JButton 来测试它是否像我想的那样可行。

这是我正在尝试做的代码示例:

import java.awt.*;
import javax.swing.*;

public class DragButton extends JButton{

private volatile int draggedAtX, draggedAtY;

public DragButton(String text){
    super(text);
    setDoubleBuffered(false);
    setMargin(new Insets(0, 0, 0, 0));
    setSize(25, 25);
    setPreferredSize(new Dimension(25, 25));

    addMouseListener(new MouseAdapter(){
        public void mousePressed(MouseEvent e){
            draggedAtX = e.getX() - getLocation().x;
            draggedAtY = e.getY() - getLocation().y;
        }
    });

    addMouseMotionListener(new MouseMotionAdapter(){
        public void mouseDragged(MouseEvent e){
            setLocation(e.getX() - draggedAtX, e.getY() - draggedAtY);
        }
    });
}

public static void main(String[] args){
    JFrame frame = new JFrame("DragButton");
    frame.setLayout(null);
    frame.getContentPane().add(new DragButton("1"));
    frame.getContentPane().add(new DragButton("2"));
    frame.getContentPane().add(new DragButton("3"));
    frame.setSize(300, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    }
}

不知何故,这无法正常工作,我不明白为什么。拖动的实际距离是鼠标移动距离的一半,拖动时它会围绕该距离闪烁,就好像两个鼠标位置正在争夺 MouseMotionListener

有人可以帮助 swing/awt noob 吗? =) 非常感谢。

编辑:

好的,所以问题是我不知道事件会在每个鼠标位置重新触发,该位置与触发 JComponent相对(!)。所以这是更正后的工作代码:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class DragButton extends JButton{

    private volatile int draggedAtX, draggedAtY;

    public DragButton(String text){
        super(text);
        setDoubleBuffered(false);
        setMargin(new Insets(0, 0, 0, 0));
        setSize(25, 25);
        setPreferredSize(new Dimension(25, 25));

        addMouseListener(new MouseAdapter(){
            public void mousePressed(MouseEvent e){
                draggedAtX = e.getX();
                draggedAtY = e.getY();
            }
        });

        addMouseMotionListener(new MouseMotionAdapter(){
            public void mouseDragged(MouseEvent e){
                setLocation(e.getX() - draggedAtX + getLocation().x,
                        e.getY() - draggedAtY + getLocation().y);
            }
        });
    }

    public static void main(String[] args){
        JFrame frame = new JFrame("DragButton");
        frame.setLayout(null);
        frame.getContentPane().add(new DragButton("1"));
        frame.getContentPane().add(new DragButton("2"));
        frame.getContentPane().add(new DragButton("3"));
        frame.setSize(300, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

感谢 Adel 的努力和 mKorbel 提供的链接。

最佳答案

你必须使用 JComponent 移动,我在 voids mousePressed/mouseDragged 中错过了这个定义;另一方面,没有比 @[camickr][1] 更好的代码了 ComponentMover .

关于java用鼠标移动组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9036730/

相关文章:

java - isCellEditable 在 Swing 中不起作用

Python Tkinter DnD2 root = TkinterDnD.Tk() 无法加载 tkdnd 库

java - 在Java中嵌入Lua函数作为成员变量

java - 无法使用 getRef() 吗?

java - 如何使用 java.util.Calendar 类在 jquery datepicker 上设置日期

java - 如何在JtabbedPane中不显示选项卡标题?

java - 如何将 Firestore 中的时间戳添加到我的变量中

java - JPanel 内的 JFileChooser;如何让用户选择

javascript - 在 Firefox 中将元素拖动到 anchor 内

jquery - 有什么好的 jQuery 拖放文件上传插件吗?