Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTable的非期望拖放行为_Java_Swing_Jtable_Drag And Drop - Fatal编程技术网

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);
    }
});