Если щелкнуть выбранный индекс в 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
. Если есть более элегантное решение, я тоже хотел бы услышать об этом. - person Joe Carnahan   schedule 27.03.2010