>我正在尝试向我的空 JList 添加一个新元素,但它没有出现。我正在 EDT 上运行它(我关于该主题的信息很少)
public void populateProjectsList(List<Project> projectsList2) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
DefaultListModel<String> listModel = (DefaultListModel) projectsList.getModel();
listModel.clear();
for (Project project : projectsList2) {
System.out.println(project.id + ") " + project.name);
listModel.addElement(project.id + ") " + project.name);
}
}
});
}
System.out.println 工作,我看到了我希望添加的正确输出,但列表仍然是空的。我在操作侦听器中尝试了listModel.addElement,它起作用了。
例如,
当从ListSelectionListener调用时,您的代码工作正常,请参见下文。
我的猜测是,您正确地将项目添加到 JList,但它们没有被看到,因为 JList 的尺寸太小,以至于看不到它的内容。处理窗口中组件的布局,或者在将一些数据添加到窗口时将一些数据放入 JList。当然,这很可能是其他原因。
一个工作示例
import java.awt.EventQueue;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
public class Main
{
public static void main(String args[])
{
new Main();
}
public Main()
{
JFrame fr = new JFrame("Hello");
DefaultListModel<String> model = new DefaultListModel<String>();
model.addElement("hello");
model.addElement("hi");
model.addElement("ola");
projectsList = new JList<>(model);
fr.add(projectsList);
fr.pack();
fr.setVisible(true);
projectsList.addListSelectionListener(
new ListSelectionListener()
{
@Override
public void valueChanged(ListSelectionEvent e)
{
List<Project> toAdd = new ArrayList<>();
toAdd.add(new Project(7, "seven"));
toAdd.add(new Project(10, "ten"));
toAdd.add(new Project(4, "four"));
populateProjectsList(toAdd);
projectsList.removeListSelectionListener(this);
}
}
);
}
JList projectsList;
private void populateProjectsList(List<Project> projectsList2)
{
EventQueue.invokeLater(
new Runnable() {
@Override
public void run()
{
DefaultListModel<String> listModel = (DefaultListModel<String>) projectsList.getModel();
listModel.clear();
for (Project project : projectsList2)
{
System.out.println(project.id + ") " + project.name);
listModel.addElement(project.id + ") " + project.name);
}
}
}
);
}
private class Project
{
int id;
String name;
public Project(int id, String name)
{
this.id = id;
this.name = name;
}
}
}