【问题标题】:drag and drop rows from a single column (not whole row)从单列(不是整行)拖放行
【发布时间】:2013-08-04 23:53:46
【问题描述】:

基于this post,我实现了一个方便的功能,可以在 JTable 中拖放行以重新排序。但是,该功能附加到整个表格,我只想将其附加到一列(显示为图标),以便鼠标事件不会在其他列中受到影响。

整行将被拖动/重新排序,但是我想使用一个专门的图标作为拖动的“手柄”,它会出现在最左边或最右边的列中。我以前见过这个概念(不是在 java 中),但现在找不到合适的例子。

目前,拖动处理程序是这样安装的:

table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.setDragEnabled(true);
table.setDropMode(DropMode.INSERT_ROWS);
table.setTransferHandler(new ReorderRowTransferHandler(table));

有没有办法将拖动处理程序仅附加到单个列?

编辑:@Kleopatra 的回答很好,但是我的部分问题是我的其他列包含组件,例如由于拖动处理程序而不再显示其“按下”状态的按钮。我希望找到一个限制拖动鼠标处理程序的解决方案,以便它影响第一列。

【问题讨论】:

  • 或者,考虑使用组合编辑器为一行选择所需的图标。
  • 所以你想移动一个单元格?
  • @MadProgrammer 不,我想移动整行,但不让整行在启动拖动时处于活动状态......所以最左边(或最右边)会有一个图标列,这将是拖动的“句柄”。
  • 仍然不完全确定你的问题是什么,如果我的回答不合适,请评论:-)
  • 我很确定表格自动拖动行为将在 TableUI 中绑定......我可能需要考虑将自定义鼠标侦听器附加到表格并从那里手动启动拖动.. .

标签: java swing jtable


【解决方案1】:

要仅在 (f.i.) 表格的第一列中启动鼠标拖动时启动 dnd,请实现自定义 TransferHandler 的 exportAsDrag 方法以在其他地方返回 NONE,例如:

@Override
public void exportAsDrag(JComponent comp, InputEvent e, int action) {
    if (e instanceof MouseEvent) {
        MouseEvent mouse = (MouseEvent) e;
        if (table.columnAtPoint(mouse.getPoint()) != 0) {
            action = NONE;
        }

    }
    super.exportAsDrag(comp, e, action);
}

【讨论】:

  • +1,这个“有效”在于,只有指定的列可以启动拖动..但是我正在寻找解决方案的部分原因是其他列现在的行为略有不同(按钮由于拖动处理程序,列不显示其“按下”状态。我希望我能找到一种方法来只改变单个拖动列的行为......有什么想法吗?
  • @pstanton no - 实际上我并没有真正理解您描述的问题 ;-) 是时候让 SSCCE 了解您在做什么以及 dragHandler 如何干扰
  • 那将是一个大的 SSCCE!我会看看接下来几天我是否有时间。感谢您的帮助。
  • @pstanton 一个大的 SSCCE - 这本身就是一个矛盾,其中一个 S 代表 small :-) 把它剥离到最简单的地方要领,通常最多 50 - 100 行就足够了
猜你喜欢
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-29
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
相关资源
最近更新 更多