Java-清除其他JList中的选择

Java-清除其他JList中的选择,java,swing,jlist,defaultlistmodel,listselectionlistener,Java,Swing,Jlist,Defaultlistmodel,Listselectionlistener,我有以下问题: 我的框架中有两个JLists: listModel = new DefaultListModel(); ownlistModel = new DefaultListModel(); fillList(); ownBookList = new JList(ownlistModel); ownBookList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); ownBook

我有以下问题: 我的框架中有两个JLists:

    listModel = new DefaultListModel();
    ownlistModel = new DefaultListModel();
    fillList();


    ownBookList = new JList(ownlistModel);
    ownBookList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    ownBookList.setLayoutOrientation(JList.VERTICAL);
    ownBookList.setSelectedIndex(-1);



    userlist = new JList(listModel);
    userlist.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    userlist.setLayoutOrientation(JList.VERTICAL);
    userlist.setSelectedIndex(0);
现在,这些选项是互斥的,因此如果有人单击一个列表中的某个项目,则应清除另一个列表中先前的选择

  ls2Handler = new ListSelectionListener(){
            @Override
                public void valueChanged(ListSelectionEvent e) {
              if (e.getValueIsAdjusting() == false) {


            //  System.out.println(ownBookList.getSelectedValue().toString().length());
                 Global.selectedUser =  ownBookList.getSelectedValue().toString();
                 Global.selectedIndex = ownBookList.getSelectedIndex();
             userlist.clearSelection();
                  updateFields(Global.selectedUser, 1);

              }


        }
    };

        lsHandler = new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent e) {
                  if (e.getValueIsAdjusting() == false) {

                //  System.out.println(userlist.getSelectedValue().toString().length());

                      Global.selectedUser =  userlist.getSelectedValue().toString();
                     Global.selectedIndex = userlist.getSelectedIndex();
                   ownBookList.clearSelection();
                      updateFields(Global.selectedUser, 0);
                  }


            }
            };


        userlist.addListSelectionListener(lsHandler);
        ownBookList.addListSelectionListener(ls2Handler);
调用Value is adjusting函数时,我总是得到nullpointerException:

线程“AWT-EventQueue-0”java.lang.NullPointerException中出现异常 在Books$3.valueChanged(Books.java:199)在 javax.swing.JList.fireSelectionValueChanged(未知源)

为什么呢?如您所见,它们已经声明并且应该可以访问。

方法可以返回
null
,并且您正在对该
null
对象调用
toString()

userlist.getSelectedValue().toString();
请参阅该方法的文档:

返回所选最小单元格索引的值;仅在列表中选择单个项目时的选定值。当选择多个项目时,它只是所选最小索引的值。如果没有选择,则返回null


当您在列表
A
上选择某个内容时,由于清除了列表
B
上的选择,您将很快遇到此异常。

多亏了Robin,我才解决了这个问题。我不知道clearselection()方法会触发侦听器。 它又快又脏,但它能工作:

    ls2Handler = new ListSelectionListener(){
        @Override
            public void valueChanged(ListSelectionEvent e) {
          if (e.getValueIsAdjusting() == false) {

              if (ownBookList.getSelectedValue()!=null) {
                  userlist.clearSelection();
                  Global.selectedUser =  ownBookList.getSelectedValue().toString();
                  Global.selectedIndex = ownBookList.getSelectedIndex();
                  updateFields(Global.selectedUser);
              }

                else {

                    }

          }

    }
};

    lsHandler = new ListSelectionListener() {

        @Override
        public void valueChanged(ListSelectionEvent e) {
              if (e.getValueIsAdjusting() == false) {

                  if (userlist.getSelectedValue()!=null) {
                     ownBookList.clearSelection();
                      Global.selectedUser =  userlist.getSelectedValue().toString();
                      Global.selectedIndex = userlist.getSelectedIndex();
                      updateFields(Global.selectedUser);


                  }
                  else {

                  }
              }


        }
        };

再次感谢

为了更快地得到更好的帮助,首先,非常感谢。我能从逻辑上看出问题所在。我有点困惑,因为我不明白为什么会发生在这里。我不是为我在其中取消选择项的列表调用函数,而是为进行选择的列表调用函数,因此我不是对不存在的选择调用toString方法……我错在哪里?再次感谢@Halest清除该选择还将触发一个
ListSelectionEvent
,因此将触发侦听器。