我正在尝试为JTable编写自定义的拖放行为,但无法接收MOUSE_DRAGGED
个事件。我想问题是本机DnD操作消耗了这个事件(如mouseDragged
的javadoc:"Due to platform-dependent Drag&Drop implementations, MOUSE_DRAGGED events may not be delivered during a native Drag&Drop operation. "
中提到的那样),但我正在寻找一种方法来禁用它,或者解决它。 / p>
这是一个证明问题的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);
}
}
答案 0 :(得分:2)
只有使用适当的鼠标(Xxx)监听器并且与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)