Java JTable的非期望拖放行为
我正在尝试向我的应用程序添加拖放功能,其中拖放事件的发起人是Java JTable的非期望拖放行为,java,swing,jtable,drag-and-drop,Java,Swing,Jtable,Drag And Drop,我正在尝试向我的应用程序添加拖放功能,其中拖放事件的发起人是JTable。我目前正在通过调用使用内置的拖动支持JTable提供 我面临的问题是,为了开始拖动操作,必须首先单击表格的一行,然后释放鼠标;只有第二次鼠标按下(以及所有后续的鼠标按下)才会生成拖动事件。即使JTable失去焦点,也会发生这种情况-即,一旦执行了第一次左键单击操作,拖放操作将非常有效,直到我切换到一个新的表格模型中。安装新型号后,需要在表上单击鼠标左键,然后拖动装置才能重新开始工作 阅读setDragEnabled(boo
JTable
。我目前正在通过调用使用内置的拖动支持JTable
提供
我面临的问题是,为了开始拖动操作,必须首先单击表格的一行,然后释放鼠标;只有第二次鼠标按下(以及所有后续的鼠标按下)才会生成拖动事件。即使JTable
失去焦点,也会发生这种情况-即,一旦执行了第一次左键单击操作,拖放操作将非常有效,直到我切换到一个新的表格模型中。安装新型号后,需要在表上单击鼠标左键,然后拖动装置才能重新开始工作
阅读setDragEnabled(boolean)
的API文档意味着这是L&F的责任,因此我可能无法解决这个问题。有人有什么建议吗?我正在使用合金L&F,但不愿意更改它。引用setDragEnabled
方法的javadoc
启用自动拖动处理后,每当用户在项目(在单一选择模式下)或选择(在其他选择模式下)上按下鼠标按钮,然后将鼠标移动几个像素时,大多数外观(包括BasicLookAndFeel子类的外观)都会开始拖放操作
如果我读对了,当您使用单选择模式时,您应该会得到所需的行为
如果需要将该行为与多个选择相结合,您可以选择手动处理表上传入的鼠标事件,并在鼠标按下时调整选择,然后将鼠标事件委托给JTable
。所以在伪代码中:
protected void processEvent(AWTEvent e) {
if ( isMouseDownEvent( e ) ){
adjustSelection( e );
}
super.processEvent( e );
}
注意:我还没有测试过这个。它完全基于我在javadoc中读到的内容,可能会有一些不必要的副作用,因为JTable
本身仍然会处理事件并对其作出反应我发现了一个黑客解决方案,这是为了在按下鼠标时将MouseListener
添加到JTable
并钩住TransferHandle
r的exportAsDrag
方法:
final JTable actionTbl = new JTable();
actionTbl.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent evt) {
// Need to explicitly start a drag operation when the mouse is pressed.
// Otherwise drags are only started *after* the user has clicked once
// on the JTable (this could be down to the L&F not doing the right thing).
actionTbl.getTransferHandler().exportAsDrag(actionTbl, evt, TransferHandler.COPY);
}
});
Adamski的解决方案运行得非常好,但我必须将最后一行中的TransferHandler.COPY
复制到TransferHandler.MOVE
以使其工作:
final JTable actionTbl = new JTable();
actionTbl.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent evt) {
actionTbl.getTransferHandler().exportAsDrag(actionTbl, evt, TransferHandler.MOVE);
}
});