将元素添加到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,它工作。

+2

考虑提供一个[可运行示例](https://*.com/help/mcve),这说明你的问题。这将导致更少的混乱和更好的反应 – MadProgrammer 2014-12-07 23:06:22

+0

应用程序使用SQLite的检索项目列表中,那么它为每个项目创建一个项目对象,并且将它们存储在列表中。这就是为什么提供可运行示例并不容易。 – 2014-12-08 09:19:36

您的代码在从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; 
     }   
    } 
} 
+0

好奇至于为什么你会不会想新的项目添加到'JLIst'当您更改所选项目...... – MadProgrammer 2014-12-07 23:45:05

+0

JList的合理尺寸,当我说我想通过一个动作侦听器使用相同的代码和它的工作。我猜测问题与线程和EDT有关,但我无法弄清楚问题所在。 – 2014-12-08 09:20:34