2010-06-05 76 views
0

我有2個類。 當我在方法addCourses()中放入粗體3行時,對話框在面板 中不顯示組合框,但是當我從addCourses中刪除並在構造函數中放入粗線時,JComboBox顯示在Panel中。JComobox沒有顯示在JDialog中

但是數據不會顯示,因爲數據項更新到ComboBox將在創建構造函數後發生。

我該如何解決這個問題。


this.mainPanel.add(courseCombo,BorderLayout.NORTH);
this.mainPanel.add(sessionCombo,BorderLayout.CENTER);
this.mainPanel.add(courseButton,BorderLayout.SOUTH);


public class Updator { 

CourseListFrame clf = new CourseListFrame(); 

for(...){ 
     clf.addContentsToBox(displayName, className); 
} 

clf.addCourses(); 
} 

和第二類是

public class CourseListFrame extends JDialog implements ActionListener { 

    public JPanel mainPanel = new JPanel(new BorderLayout(2, 2)); 
    public JButton courseButton = new JButton(("Submit")); 
    public JComboBox courseCombo; 
    public JComboBox sessionCombo; 
    public Multimap<String, String> map; // = HashMultimap.create(); 
    public static CourseListFrame courseListDialog; 

    public CourseListFrame() { 
     super(this.getMainFrame()); 
     this.getContentPane().add(mainPanel); 

     map = HashMultimap.create(); 
     courseCombo = new JComboBox(); 
     courseCombo.addItem("Select Courses"); 
     courseCombo.addActionListener(this); 
     sessionCombo = new JComboBox(); 
    } 

    public void addContentsToBox(String course, String session) { 
     map.put(course, session); 
     courseCombo.addItem(course); 
    } 

    public void actionPerformed(ActionEvent e) { 
     JComboBox cb = (JComboBox) e.getSource(); 
     String str = (String) cb.getSelectedItem(); 
     setSessionCombo(str); 
    } 



    public void setSessionCombo(String course) { 
     if (map.containsKey(course)) { 
      sessionCombo.removeAllItems(); 
      Iterator it = map.get(course).iterator(); 
      while (it.hasNext()) { 
       sessionCombo.addItem(it.next()); 
      } 
     } 
    } 

    public void addCourses() { 
     this.mainPanel.add(courseCombo, BorderLayout.NORTH); 
     this.mainPanel.add(sessionCombo, BorderLayout.CENTER); 
     this.mainPanel.add(courseButton, BorderLayout.SOUTH); 

    } 

    public static void showCourseListDialog() { 
     if (courseListDialog == null) { 
      courseListDialog = new CourseListFrame(); 
     } 
     courseListDialog.pack(); 
     courseListDialog.setVisible(true); 
     courseListDialog.setSize(260, 180); 
    } 
} 
+0

使用'this'在調用'超()'不應該編譯。 – akf 2010-06-05 04:00:16

+0

退出交叉發佈:http://forums.sun.com/thread.jspa?threadID=5441271&tstart=0。花更多時間詢問支持代碼的正確問題,減少交叉發佈的時間。你還沒有製作出正確的SSCCE,因此你仍然沒有答案。 – camickr 2010-06-05 15:16:10

回答

1

爲什麼他們arent顯示的原因是因爲你很可能調用靜態showCourseListDialog()顯示您的對話框。此方法將測試您的靜態courseListDialog是否爲空,如果是,則創建一個並設置對話框可見,而不是您實例化的clf

如果您showCourseListDialog()你叫實例化你的「單身」後addCourses()方法,你應該確定:

public static void showCourseListDialog() { 
    if (courseListDialog == null) { 
     courseListDialog = new CourseListFrame(); 
     courseListDialog.addCourses();// <<---- this is key! 
    } 
    courseListDialog.pack(); 
    courseListDialog.setVisible(true); 
    courseListDialog.setSize(260, 180); 
} 

也就是說,通過具有staticcourseListDialog,顯而易見的是,你想要的對話框是一個單身人士。如果是這樣的話,我會至少使你的構造函數private。您希望主動避免您正在進入可以構建單例的多個實例的情況。您的showCourseListDialog仍然會有競爭條件來處理,但由於您只能在美國東部時間這種方式稱呼此方法,您應該是安全的。

採取的Java看看this等話題上辛格爾頓發展(不要忘記閱讀它被描述爲一個反模式的con arguments

+0

感謝akf對你的建議。是的,這是兩種不同類別的競賽條件。我得到它的工作:-) THANKs單身鏈接也。 – 2010-06-07 08:27:15