我發現了一個可能的解決方案。您可以包圍鼠標偵聽器,以便在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