新手在这里。
当我在DefaultListModel中添加一个元素时,我使用了一个覆盖toString的类。 根据下面的示例代码,我想在单击按钮btnid时显示所选项目的ID。
displayID下的命令似乎不起作用。请帮忙。谢谢!
class SomeClass {
JFrame f = new JFrame("Sample");
JScrollPane sp = new JScrollPane();
DefaultListModel dlm = new DefaultListModel();
JList lst = new JList(dlm);
public SomeClass() {
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton btnadd = new JButton("Add");
JButton btnid = new JButton("View ID");
Container p = f.getContentPane();
sp.getViewport().add(lst,null);
p.add(sp, BorderLayout.WEST);
p.add(btnadd, BorderLayout.EAST);
p.add(btnid, BorderLayout.SOUTH);
btnadd.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dlm.addElement(new ElementDisplay(dlm.getSize(),"Element " + dlm.getSize()));
}
});
btnid.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
displayID();
}
});
f.pack();
f.setVisible(true);
}
private void displayID() {
ElementDisplay ed;
ed = dlm.getElementAt(lst.getSelectedIndex());
System.out.println(ed.elementID);
}
public static void main(String args[]) {
SomeClass sc = new SomeClass();
}
class ElementDisplay {
public int elementID;
private String elementDescription;
public ElementDisplay(int pid, String pdesc) {
elementID=pid;
elementDescription=pdesc;
}
@Override
public String toString() {
return elementDescription;
}
}
}
答案 0 :(得分:0)
对我来说很好。是什么让你觉得它不起作用?您需要在列表中选择一个项目才能按下按钮,您将获得ArrayIndexOutOfBoundException
不要依赖按钮按下,只需向JList
添加一个监听器即可。这种方式只有在选择了JList
中的项目时才会打印。无需按钮并尝试避开ArrayIndexOutOfBoundException
lst.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
if (e.getValueIsAdjusting()) {
JList list = (JList)e.getSource();
DefaultListModel model = (DefaultListModel)list.getModel();
ElementDisplay ed = (ElementDisplay) model.getElementAt(lst.getSelectedIndex());
System.out.println(ed.elementID);
}
}
});
请参阅How to Write Event Listeners,您将遇到可用于不同组件的可能侦听器。由于GUI是事件驱动的,你应该花时间学习它们中的大部分。