JList clearSelection () проблема - PullRequest
2 голосов
/ 23 июля 2010

У меня проблема с моими двумя компонентами JList.

Я создал и разместил на JFrame два компонента JList. Я добавил listSelectionListeners к ним обоим, которые должны отменить выбор другого JList следующим образом: (редактировать: сделать по запросу автономный образец)


public class JListIssue {

     public static void main(String[] args) {
          JFrame frame = new JFrame();
          JPanel mainPanel = new JPanel();
          frame.setContentPane(mainPanel);

          final JList jList1 = new JList();
          mainPanel.add(jList1);
          final JList jList2 = new JList();
          mainPanel.add(jList2);

          // Setting up models for both JList components to display example values
          jList1.setModel(new AbstractListModel() {
            String[] items = {"Item 1", "Item 2", "Item 3"};
            public int getSize() { return items.length; }
            public Object getElementAt(int i) { return items[i]; }
          });

          jList2.setModel(new AbstractListModel() {
            String[] items = {"Item 1", "Item 2", "Item 3"};
            public int getSize() { return items.length; }
            public Object getElementAt(int i) { return items[i]; }
          });


          // Adding listeners
          jList1.addListSelectionListener(new ListSelectionListener() {

               public void valueChanged(ListSelectionEvent e) {
                    jList2.clearSelection();
               }
          });

          jList2.addListSelectionListener(new ListSelectionListener() {

               public void valueChanged(ListSelectionEvent e) {
                    jList1.clearSelection();
               }
          });

          frame.pack();
          frame.setVisible(true);
     }
}

Однако, когда он отменяет выбор одного из этих двух списков, я должен щелкнуть два раза, чтобы сделать новый выбор. Поскольку первый раз, когда я щелкаю по нему, он как бы ограничивает элемент, который я хочу выделить, он на самом деле не выбирает его (подтверждается listSelectionListener), поэтому мне нужно либо двигать мышь, удерживая левую кнопку мыши во время первого выбора, либо щелкнуть второй раз а затем он фактически выбирает элемент.

Я нахожу это поведение странным, и я не хочу, чтобы оно вело себя так. Любое предложение?

Ответы [ 2 ]

1 голос
/ 08 ноября 2011

вы можете получить доступ к событию variabl e, которое может указывать, является ли данное текущее событие серией нескольких событий getValueIsAdjusting ()

public void valueChanged(ListSelectionEvent e) {
    if (e.getValueIsAdjusting())
       jList1.clearSelection();
}
1 голос
/ 23 июля 2010

Ваша проблема в том, что ваш ListSelectionListener получает уведомление в ответ на вызов clearSelection () из другого списка. Когда вы делаете выбор на jlist1, он вызывает clearSelection на jlist2; если у jlist2 есть что-то выбранное, это вызовет valueChanged на слушателе выбора jlist2, очистив выбор, который вы только что закончили делать на jlist1. Возможно, вам понадобится добавить флаг, который позволит двум слушателям узнать, меняется ли другой в данный момент:

//member variable
boolean isChanging = false;

//later.... make this same change in both ListSelectionListeners!
jList2.addListSelectionListener(new ListSelectionListener() {

 public void valueChanged(ListSelectionEvent e) {
      if (!isChanging) {
        isChanging = true;
        jList1.clearSelection();
        isChanging = false;
      }
 }

});

...