2

我的两个 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 确认),所以我必须在第一次选择期间按住鼠标左键移动鼠标或单击第二次然后它实际上选择了该项目。

我发现这种行为很奇怪,我不希望它表现得像这样。有什么建议吗?

4

2 回答 2

1

您的问题是您的 ListSelectionListener 收到通知以响应来自其他列表的 clearSelection() 调用。当您在 jlist1 上进行选择时,它会在 jlist2 上调用 clearSelection;如果 jlist2 选择了任何内容,这将在 jlist2 的选择侦听器上触发 valueChanged,清除您刚刚在 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;
      }
 }

});

于 2010-07-23T14:34:10.203 回答
1

您可以访问事件变量e,它可以指示当前事件是否是一系列多个事件getValueIsAdjusting()

public void valueChanged(ListSelectionEvent e) {
    if (e.getValueIsAdjusting())
       jList1.clearSelection();
}
于 2011-11-08T00:59:07.990 回答