我看过很多帖子并尝试了不同的方法来解决这个问题,但我仍然没有得到所选项目的列表。这是我使用的代码。
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();
提前致谢!!
最佳答案
您在这一行得到 NPE:
JLogicDesign jld = new JLogicDesign(f,listOfDevices);
devices = new ArrayList<String>();
devices = jld.getSelectedDeviceList(); // NPE here
因为JLogicDesign
中的list
变量只有在按下btnOk
时才会被初始化。因此,在按下此按钮之前会执行指向的行,这就是它抛出 NPE 的原因。
为了避免 NPE,您应该在 JLogicDesign
中初始化 list
。然而它并不能解决问题。您不会得到 NPE,但会得到一个空列表。这是因为 JLogicDesign
不是模态的,即使这些句子正在 Event Dispatch Thread 上执行。 jld.getSelectedDeviceList()
将返回按下 btnOk
之前的列表
。
如果您在继续之前需要选定的设备,请考虑使用模态 JDialog
。
关于java - 从 Jlist 获取选定的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19597874/