java - 如何接收 JTable 的 mouseDragged 事件

标签 java swing drag-and-drop jtable mouselistener

我正在尝试为 JTable 编写自定义拖放行为,但无法接收 MOUSE_DRAGGED 事件。我猜问题是 native DnD 操作消耗了该事件(如 mouseDragged 的 javadoc 中所述:“由于依赖于平台的拖放实现,MOUSE_DRAGGED 事件可能不会在 native 拖放期间传递操作。”),但我正在寻找一种方法来禁用它,或解决它。

这是演示问题的 SSCCE:

public class DragAndDrop {
    @SuppressWarnings("serial")
    public static void main(String[] args) {
        JFrame f = new JFrame();
        f.getContentPane().add(
                new JTable(
                        new Object[][] {{1,2,3},{4,5,6}}, 
                        new Object[] {"one", "two", "three"}) 
                {{

                        addMouseListener(new MouseAdapter() {

                            @Override
                            public void mouseDragged(MouseEvent e) {
                                System.out.println("mouseDragged");
                            }

                            @Override
                            public void mousePressed(MouseEvent e) {
                                System.out.println("mousePressed");
                            }

                            @Override
                            public void mouseReleased(MouseEvent e) {
                                System.out.println("mouseReleased");
                            }

                        });
                }}
        );

        f.setVisible(true);
    }
}

最佳答案

  • 只有使用正确的 Mouse(Xxx)Listener 并与 MouseAdapter 结合的错误才不会因异常而哭泣

  • 您添加了MouseListener,正确的可以是MouseListener,并与MouseMotionListener一起,您可以将这两个Listener拆分为两个单独的代码块(另一个可能的错误)TransferHandler

.

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JTable;

public class DragAndDrop {

    public static void main(String[] args) {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new JTable(new Object[][]{{1, 2, 3}, {4, 5, 6}},
                new Object[]{"one", "two", "three"}) {
            {
                addMouseMotionListener(new MouseAdapter() {
                    @Override
                    public void mouseDragged(MouseEvent e) {
                        System.out.println("mouseDragged");
                    }

                    @Override
                    public void mousePressed(MouseEvent e) {
                        System.out.println("mousePressed");
                    }

                    @Override
                    public void mouseReleased(MouseEvent e) {
                        System.out.println("mouseReleased");
                    }
                });
            }
        });
        f.setVisible(true);
    }
}

run: 
mouseDragged mouseDragged mouseDragged 
mouseDragged mouseDragged 
BUILD STOPPED (total time: 1 minute 11 seconds)

关于java - 如何接收 JTable 的 mouseDragged 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19270931/

相关文章:

ios - 能够缩短 UIDragInteraction 的长按时间

java - 如何在 micronaut-data 中注入(inject)多个数据源的 JPA 存储库?

java - 如何读取 CSV 文件的第一列

java - TextView 不会根据 SeekBar 进度自动更新

java - 直接在玻璃板上绘图 : not working

java - 重置jmappane的光标

jquery - 拖放和追加未正确定位 div 元素

java - 从 JSP 输入到 JavaFX

java - 单击 JButton 设置文本样式后保持选择

javascript - JqueryUI droppable 'out' 事件不会触发