【发布时间】:2011-02-01 11:16:02
【问题描述】:
如果单击 JList 上的选定索引,我希望它取消选择。换句话说,单击索引实际上会切换它们的选择。好像不支持,所以我尝试了
list.addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent evt)
{
java.awt.Point point = evt.getPoint();
int index = list.locationToIndex(point);
if (list.isSelectedIndex(index))
list.removeSelectionInterval(index, index);
}
});
这里的问题是,这是在 JList 已经对鼠标事件起作用之后调用的,所以它取消选择所有内容。因此,我尝试删除所有 JList 的 MouseListeners,添加我自己的,然后将所有默认侦听器添加回来。这不起作用,因为 JList 在我取消选择索引后会重新选择它。无论如何,我最终想出的是
MouseListener[] mls = list.getMouseListeners();
for (MouseListener ml : mls)
list.removeMouseListener(ml);
list.addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent evt)
{
java.awt.Point point = evt.getPoint();
final int index = list.locationToIndex(point);
if (list.isSelectedIndex(index))
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
list.removeSelectionInterval(index, index);
}
});
}
});
for (MouseListener ml : mls)
list.addMouseListener(ml);
... 这行得通。但我不喜欢它。有没有更好的办法?
【问题讨论】:
-
老实说,我会按照您已经描述的那样使用
MouseAdapter。如果有更优雅的解决方案,我也很想听听。 -
JList 默认支持此功能,但您必须按住 Ctrl 并单击(至少在 Windows 上)选中的项目才能取消选择它。