【发布时间】:2019-05-22 18:28:35
【问题描述】:
我正在开发一个读取Name,Height,Weight,Size (String,int,int,String) 并创建Person 类型对象的程序。
输入(当然不是在控制台上)应该如下所示:
Mary (h=170, w=56, size=S)
John (h=160, w=76, size XL)
在我单击添加
之后,在带有 JScrollPane 的 JList 上我创建了一个 jButton:
JButton addPerson = new JButton("Add");
然后我添加了新的 ActionListener
addPerson.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == addPerson) {
int Height = sliderHeight.getValue();
int Weight = sliderWeight.getValue();
String name = nameField.getText();
String size = (String) sizes.getSelectedItem();
if (name.length() > 0) {
model.addPerson(Height, Weight, name, size);
//The `model` here is an Object of ListData class.
}else {
System.out.println("Enter the name.");
}
}
}
});
这就是我的 AbstarctModel 类的样子:
private class ListData extends AbstractListModel<Person> {
ArrayList<Person> lista = new ArrayList<Person>();
@Override
public int getSize() {
return lista.size();
}
public void addPerson(int Height, int Weight, String name, String size) {
lista.add(new Person(Height, Weight, name, size));
fireIntervalAdded(this, 0, lista.size());
//I think the problem is somewhere here.
System.out.println("Person added.");
System.out.println("List size: " + getSize());
for (Person p : lista) {
System.out.println(p);
}
}
@Override
public Person getElementAt(int arg0) {
// TODO Auto-generated method stub
return null;
}
}
这工作正常,Person 对象被创建并添加到 ArrayList。
但是
它不会出现在JList 上(就在JSliders 上方)
所以,总结一下,
Person 类型 Object 已创建,添加到 ArrayList 但现在在我使用 fireIntervalAdded() 方法后显示在 JList 上。
【问题讨论】:
-
为什么只添加了一个元素,却报
[0, lista.size()]的区间?除此之外,您的模型与DefaultListModel<Person>相比有什么显着优势吗?进一步注意,您现在可以使用 lambda 表达式来实现ActionLister,并且当您添加侦听器的唯一事件源是addPerson时,您不需要e.getSource() == addPerson测试。 -
哦,如果
Person出现在 UI 中,只要getElementAt返回null,那就很奇怪了。 -
哦,maan,这就是这个方法存在的原因!谢谢你。还有一件事,你能告诉我如何用 lambda 改变我的实现吗?我以前从未使用过它,但我知道我应该这样做。再次感谢