tags:

views:

32

answers:

1

hello, I have a problem with my two JList components.

I created and placed on JFrame two JList components. I added listSelectionListeners to both of them that should unselect a selection of the other JList like so: (edit: To make as requested self-contained sample)


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);
     }
}

However, when it deselects the selection of one of those two lists I have to click two times to make a new selection. Because first time I click it sort of borders the item I want to select by it doesn't really selects it (confirmed by listSelectionListener) so I have to either move my mouse while holding the left mouse button during the first selection or click second time and then it actually selects the item.

I find this behaviour wierd and I don't want it to behave like this. Any suggestion?

+1  A: 

Your problem is that your ListSelectionListener gets notified in response to the clearSelection() call from the other list. When you make a selection on jlist1, it calls clearSelection on jlist2; if jlist2 has anything selected, this will trigger valueChanged on jlist2's selection listener, clearing the selection you just finished making on jlist1. You'll probably need to add a flag that lets the two listeners know if the other one is currently changing:

//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;
      }
 }

});

Sbodd
thanks, I didn't realize that it triggers the other listener, thx a lot :-)
Martin S.