2013-10-25 90 views
0

我看過很多帖子&嘗試過不同的方式來解決這個問題,但我仍然沒有得到我選擇的項目列表。這是我使用的代碼。獲取所選項目從Jlist

public List<String> getSelectedDeviceList() 
    { 
     return list; 
    } 
    /** 
    * Create the frame. 
    */ 
    public JLogicDesign(Frame frame, List<String> listDevices) { 

     super(); 
     setTitle("Device Names"); 

     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     setBounds(100, 100, 331, 316); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     setContentPane(contentPane); 

     jlistModel = new DefaultListModel(); 
     for(String s: listDevices) 
     { 
      jlistModel.addElement(s); 
     } 

     final JList jlist = new JList(jlistModel); 
     jlist.setVisibleRowCount(5); 
     JScrollPane scrollPane = new JScrollPane(); 
     scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); 


     btnOk = new JButton("OK");  
     btnOk.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent evt) 
      {     

        list = new ArrayList<String>(); 
        Object[] values = jlist.getSelectedValues(); 
        for(Object o: values) 
        { 
         list.add(o.toString()); 
        }    
       dispose(); 
      } 
     }); 

JList正在被正確填充。當我嘗試獲取所選項目時,我得到一個NPE。

這是另一個課堂,我打電話給上面的類提前

JLogicDesign jld = new JLogicDesign(f,listOfDevices);   

      devices = new ArrayList<String>(); 
      devices = jld.getSelectedDeviceList(); 

謝謝!

+0

只是簡單的評論,[JList.getSelectedValues()](http://docs.oracle.com/javase/7/docs/api/javax/swing/JList.html#getSelectedValues%28%29)已被棄用自java 1.7以來。您應該使用[JList.getSelectedValuesList()](http://docs.oracle.com/javase/7/docs/api/javax/swing/JList.html#getSelectedValuesList%28%29)。 – dic19

+0

我安裝的java版本是1.6。 – SilentCoder

+0

你在哪一行得到異常? –

回答

1

你在這行獲得NPE:

JLogicDesign jld = new JLogicDesign(f,listOfDevices); 
devices = new ArrayList<String>(); 
devices = jld.getSelectedDeviceList(); // NPE here 

由於JLogicDesignlist變量時按下btnOk只初始化。所以在按下這個按鈕之前執行尖銳的線條,這就是爲什麼它會拋出NPE。

爲了避免NPE,您應該在JLogicDesign中初始化list。但它不能解決問題。你不會得到NPE,但你會得到一個空的列表。這是因爲JLogicDesign不是模態的,即使這些句子正在執行Event Dispatch Threadjld.getSelectedDeviceList()將返回list之前btnOk被按下。

如果您需要選擇的設備之前繼續然後考慮使用模態JDialog

+0

噢好吧。那麼在OK按鈕被按下後應該怎麼做才能執行特定的行呢? – SilentCoder

+0

@sarath在嘗試訪問設備列表之前,您必須等待GUI被釋放。查看事件分派線程。 – Obicere

+0

@ dic19:更新 - 我實際上在OK按鈕被按下之前初始化列表。但這次如預期的那樣,我沒有得到一個NPE,而是一個空的列表,這是公平的,但即使選擇了一些項目,我也會得到一個空列表? – SilentCoder