JList - уже отмените выбор при нажатии выбранный пункт

Если выбранный индекс на 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);

... и это работает. Но мне не нравится он. Существует ли лучший путь?

11
задан skaffman 27 March 2010 в 16:43
поделиться

2 ответа

Как насчет этого?

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) работает. Я уверен, что это можно исправить, но я предполагаю, что вы спрашивали об этом для списков единственного выбора ... Если не изменить свой вопрос, мы можем начать думать о решениях проблемы множественного выбора.

4
ответ дан 3 December 2019 в 06:20
поделиться

Вы могли бы всегда использовать 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

http://java.sun.com/docs/books/tutorial/uiswing/examples/events/ListSelectionDemoProject/src/events/ListSelectionDemo.java

В приведенной выше ссылке на java файл есть реализация, которая может быть легко улучшена для выполнения "deselection" :)

0
ответ дан 3 December 2019 в 06:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: