从Jlist中获取所选项目

时间:2013-10-25 19:23:39

标签: java swing

我见过很多帖子&尝试了不同的方法来解决这个问题,但我仍然没有得到我的选定项目列表。这是我使用的代码。

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。当我尝试获取所选项目时,我得到了一个N​​PE。

这是我正在调用上述类

的另一个类
JLogicDesign jld = new JLogicDesign(f,listOfDevices);           

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

提前致谢!!

1 个答案:

答案 0 :(得分:1)

你可以在这条线上获得NPE:

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

因为list中的JLogicDesign变量仅在按下btnOk时初始化。因此,在按下此按钮之前执行指向的线,这就是它抛出NPE的原因。

要避免NPE,请在list中初始化JLogicDesign。但它并没有解决问题。你不会得到NPE,但你会得到一个空列表。这是因为JLogicDesign不是模态的,即使在Event Dispatch Thread jld.getSelectedDeviceList()上执行这些句子,也会在 {{1}之前返回list 按下了。

如果您在之前需要所选设备,请考虑使用模式btnOk