首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JList clearSelection()问题

JList clearSelection()问题
EN

Stack Overflow用户
提问于 2010-07-23 22:01:46
回答 2查看 11.1K关注 0票数 2

我的两个JList组件有问题。

我创建了两个JList组件并将其放置在JFrame上。我将listSelectionListeners添加到这两个JList中,这样就可以取消选择另一个示例:(edit:按要求制作自包含样本)

代码语言:javascript
复制
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确认),所以我必须在第一次选择时按住鼠标左键移动鼠标,或者第二次单击,然后它实际上选择了该项目。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-23 22:34:10

您的问题是,响应来自另一个列表的clearSelection()调用,您的ListSelectionListener会收到通知。当您在jlist1上进行选择时,它将在jlist2上调用clearSelection;如果jlist2选择了任何内容,这将在jlist2的选择侦听器上触发valueChanged,清除您刚刚在jlist1上完成的选择。您可能需要添加一个标志,让两个侦听器知道另一个侦听器当前是否正在更改:

代码语言:javascript
复制
//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;
      }
 }

});

票数 1
EN

Stack Overflow用户

发布于 2011-11-08 08:59:08

您可以访问事件变量getValueIsAdjusting(),该变量可以指示此当前事件是否为一系列多事件事件

代码语言:javascript
复制
public void valueChanged(ListSelectionEvent e) {
    if (e.getValueIsAdjusting())
       jList1.clearSelection();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3318824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档