Если выбранный индекс на 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 уже действовал на событие от нажатия мыши, таким образом, это отменяет выбор всего. Таким образом я пытался удалить все MouseListeners JLIST, добавляя мое собственное, и затем добавляя всех слушателей по умолчанию назад. Это не работало, так как 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);
... и это работает. Но мне не нравится он. Существует ли лучший путь?
Как насчет этого?
import javax.swing.DefaultListSelectionModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.ListSelectionModel;
public class A {
public static void main(String[] args) {
JFrame f = new JFrame("Test");
final JList list = new JList(new String[] {"one","two","three","four"});
list.setSelectionModel(new DefaultListSelectionModel(){
@Override
public void setSelectionInterval(int index0, int index1) {
if (index0==index1) {
if (isSelectedIndex(index0)) {
removeSelectionInterval(index0, index0);
return;
}
}
super.setSelectionInterval(index0, index1);
}
@Override
public void addSelectionInterval(int index0, int index1) {
if (index0==index1) {
if (isSelectedIndex(index0)) {
removeSelectionInterval(index0, index0);
return;
}
super.addSelectionInterval(index0, index1);
}
}
});
f.getContentPane().add(list);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setVisible(true);
}
}
Это работает, но обратите внимание на один побочный эффект ... Если вы установите режим множественного выбора, например, так:
list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION );
вы не можете выбрать несколько объектов с помощью перетаскивания мышью. Щелчок Ctrl (или Shift) работает. Я уверен, что это можно исправить, но я предполагаю, что вы спрашивали об этом для списков единственного выбора ... Если не изменить свой вопрос, мы можем начать думать о решениях проблемы множественного выбора.
Вы могли бы всегда использовать ListSelectionListener вместо расшифровки нажатой точки и последующего перевода ее в выбранный элемент.
http://java.sun.com/docs/books/tutorial/uiswing/examples/events/index.html#ListSelectionDemo
http://java.sun.com/docs/books/tutorial/uiswing/events/listselectionlistener.html
В приведенной выше ссылке на java файл есть реализация, которая может быть легко улучшена для выполнения "deselection" :)