gpt4 book ai didi

java - 使用 fireIntervalAdded() 方法在 JList(使用 JScrollPane)上显示 Person 类型对象

转载 作者:行者123 更新时间:2023-11-30 01:50:25 24 4
gpt4 key购买 nike

程序截图 A

我正在开发一个程序,该程序读取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 类型对象已创建,添加到 ArrayList 中,但在我使用 fireIntervalAdded() 方法后,现在显示在 JList 上。

最佳答案

您的 ListData 有两个问题执行。首先,你的getElementAt返回null而不是列表元素,因此显然,UI 中不能显示任何列表元素。其次,事件报告的时间间隔应该只反射(reflect)受影响的元素,即添加的元素,而不是整个数据范围。

固定版本看起来像

private static class ListData extends AbstractListModel<Person> {
private final ArrayList<Person> lista = new ArrayList<>();

@Override
public int getSize() {
return lista.size();
}

@Override
public Person getElementAt(int index) {
return lista.get(index);
}

public void addPerson(int height, int weight, String name, String size) {
int index = lista.size();
lista.add(index, new Person(height, weight, name, size));
fireIntervalAdded(this, index, index);
}
}

请注意,与 Collection API(以及大多数其他 API)不同,Swing 使用包含结束索引,因此我们必须指定 [ index, index ] 这里。在末尾添加多个元素时,我们必须指定 [ index, lista.size()-1 ],而其他 API 只需要 lista.size()作为独家结束索引。

进一步注意,此模型类的功能与 DefaultListModel<Person> 重叠。这可能更容易使用。

并且可以使用lambda表达式来实现ActionListener s:

JButton addPerson = new JButton("Add");
addPerson.addActionListener(event -> {
int height = sliderHeight.getValue();
int weight = sliderWeight.getValue();
String name = nameField.getText();
String size = (String) sizes.getSelectedItem();

if (!name.isEmpty()) {
model.addPerson(height, weight, name, size);
}else {
System.out.println("Enter the name.");
}
});

e.getSource() == addPerson测试是不必要的,如addPerson是这里唯一可能的事件源。

关于java - 使用 fireIntervalAdded() 方法在 JList(使用 JScrollPane)上显示 Person 类型对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56262915/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com