我发现了一个可能的解决方案。您可以包围鼠标侦听器,以便在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);
}
这是一个在许多方面的丑陋的黑客攻击,但是......现在它似乎工作。
当我刚才尝试这个时,我无法选择多个项目。点击拖动时,选择会消失。 – mentics 2011-05-17 22:08:59