将元素添加到JList不起作用
我试图向我的空JList中添加一个新元素,但它没有出现。我运行它的EDT(我已经在这个问题上非常低的信息)将元素添加到JList不起作用
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;
}
}
}
好奇至于为什么你会不会想新的项目添加到'JLIst'当您更改所选项目...... – MadProgrammer 2014-12-07 23:45:05
JList的合理尺寸,当我说我想通过一个动作侦听器使用相同的代码和它的工作。我猜测问题与线程和EDT有关,但我无法弄清楚问题所在。 – 2014-12-08 09:20:34
考虑提供一个[可运行示例](https://*.com/help/mcve),这说明你的问题。这将导致更少的混乱和更好的反应 – MadProgrammer 2014-12-07 23:06:22
应用程序使用SQLite的检索项目列表中,那么它为每个项目创建一个项目对象,并且将它们存储在列表中。这就是为什么提供可运行示例并不容易。 – 2014-12-08 09:19:36