我正在尝试为 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/