0

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

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

提前致谢 !!

4

1 回答 1

1

你在这一行得到 NPE:

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

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

为避免 NPE,您应该listJLogicDesign. 然而它并不能解决问题。你不会得到 NPE,但你会得到一个空列表。这是因为JLogicDesign不是模态的,即使这些语句正在Event Dispatch Thread jld.getSelectedDeviceList()上执行,也会返回list 之前 btnOk被按下的。

如果您在继续之前需要选定的设备,请考虑使用 modal JDialog

于 2013-10-25T20:21:33.080 回答