java - 如何使 JTable 单击未选择的内容进行拖动而不是选择

标签 java swing

如果您使用 table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION) 设置了 JTable,然后在尚未选择的行上单击拖动,它会开始选择多行。我们不想要这种行为。我们希望这样,如果您单击一个节点,即使它尚未被选中,它也会开始拖动它。

我们确实需要打开多选模式,因此将其设置为单选(这确实会导致我们想要的行为)不是一个选项。

更新:在这一点上,它似乎需要某种丑陋的 hack,因为逻辑在私有(private)方法 BasicTableUI$Handler.canStartDrag 中

最佳答案

我找到了一种可能的解决方案。您将鼠标监听器括起来,这样您就可以在 canStartDrag 调用期间欺骗对 isCellSelected 的调用。

子类 JTable(或者在我的例子中,JXTreeTable)。在构造函数中调用这个:

private void setupSelectionDragHack()
{
    // Bracket the other mouse listeners so we may inject our lie
    final MouseListener[] ls = getMouseListeners();
    for (final MouseListener l : ls)
    {
        removeMouseListener(l);
    }
    addMouseListener(new MouseAdapter()
    {
        @Override
        public void mousePressed(final MouseEvent e)
        {
            // NOTE: it might not be necessary to check the row, but... I figure it's safer maybe?
            mousingRow = rowAtPoint(e.getPoint());
            mousingInProgress = true;
        }
    });
    for (final MouseListener l : ls)
    {
        addMouseListener(l);
    }
    addMouseListener(new MouseAdapter()
    {
        @Override
        public void mousePressed(final MouseEvent e)
        {
            mousingInProgress = false;
        }
    });
}

然后你需要这个:

@Override
public boolean isCellSelected(final int row, final int column)
{
    if (mousingInProgress && row == mousingRow)
    {
        // Only lie to the canStartDrag caller. We tell the truth to everyone else.
        final StackTraceElement[] elms = Thread.currentThread().getStackTrace();
        for (int i = 0; i < 3; i++)
        {
            if (elms[i].getMethodName().equals("canStartDrag"))
            {
                return mousingInProgress;
            }
        }
    }
    return super.isCellSelected(row, column);
}

这在很多方面都是一个丑陋的 hack,但是......现在它似乎有效。

关于java - 如何使 JTable 单击未选择的内容进行拖动而不是选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5969258/

相关文章:

java - 更改默认的 JLabel 字体

java - 如何仅接受 JTextField 中的指定模式?

java - 为什么 Java 对象在 Java 继承中产生不同的输出?

java - 当我单击按钮时导航屏幕打开,但当我再次单击它时它不会再次关闭

java - 依赖冲突并且找不到 jar 来解决该问题

java - UI-Update 后 SpringLayout 中组件的宽度等于 0

java - 有没有办法在 Swing 中设置 Ubuntu 默认焦点按钮颜色?

Java:使用 JOptionPane.showInputDialog(null, "Text") 的多行文本;

java - HIbernate 仅保留带有 id 的对象

java - 如何从具有 GridBagLayout 布局的 JPanel 中获取位于特定 gridx、gridy 中的组件?