2013-10-25 68 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