0

我有以下问题:我的框架中有 2 个 JList:

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

在调用值调整函数时,我总是得到 nullpointerException:

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

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

4

2 回答 2

4

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

userlist.getSelectedValue().toString();

请参阅该方法的文档:

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

B而且由于您在选择 list 上的某些内容时清除了 list 上的选择A,因此您很快就会遇到此异常。

于 2012-08-30T06:24:38.217 回答
3

感谢罗宾,我想通了。我不知道 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 {

                  }
              }


        }
        };

再次感谢!

于 2012-08-30T07:37:48.663 回答