2012-08-30 17 views
0

我有以下問題: 有2個JList的在我的框架:爪哇 - 清除選擇在其他的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異常:

在書籍$ 3.valueChanged(書籍異常在線程 「AWT-EventQueue的-0」 顯示java.lang.NullPointerException 。 javax.swing.JList.fireSelectionValueChanged(Unknown Source)

爲什麼?正如你所看到的,它們已經被宣佈並且應該可以訪問。

+1

更好地幫助發佈[SSCCE](http://sscce.org/) – mKorbel

回答

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 { 

        } 
       } 


     } 
     }; 

再次感謝!

4

getSelectedValue()方法可以返回null,並且要將該null對象

userlist.getSelectedValue().toString(); 

上調用toString()見該方法的文檔:

返回選擇的最小單元的索引值;在列表中只選擇單個項目時的選定值。選擇多個項目時,它只是最小選定索引的值。如果沒有選擇,則返回null。

而且因爲你在選擇列表上的東西A清除列表B的選擇,你會很快遇到此異常。

+0

首先,非常感謝。我可以合理地看到問題出在哪裏。我有點困惑,因爲我看不出它爲什麼發生在這裏。我沒有調用列表的功能,我取消了選擇項目,但選擇的項目,所以我沒有調用toString方法對未來的選擇...我在哪裏錯了?再次感謝! – Halest

+0

@Halest清除選擇內容也會觸發'ListSelectionEvent',因此會觸發監聽器。 – Robin