2014-12-07 61 views
0

我試圖向我的空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://stackoverflow.com/help/mcve),這說明你的問題。這將導致更少的混亂和更好的反應 – MadProgrammer 2014-12-07 23:06:22

+0

應用程序使用SQLite的檢索項目列表中,那麼它爲每個項目創建一個項目對象,並且將它們存儲在列表中。這就是爲什麼提供可運行示例並不容易。 – 2014-12-08 09:19:36

回答

0

您的代碼在從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