2010-06-05 6 views
0

J'ai 2 classes. lorsque je mets gras 3 lignes dans la méthode addCourses() la boîte de dialogue ne montre pas de liste déroulante dans le panneau mais quand je supprime de addCourses et mettre ces lignes en gras dans le constructeur, JComboBox sont affichés dans le panneau.JComobox ne montre pas dans le JDialog

Mais les données ne s'afficheront pas car les mises à jour des éléments de données vers ComboBox se produiront après la création du constructeur.

Comment puis-je résoudre ce problème.


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(); 
} 

et deuxième classe est

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

l'utilisation de 'this' dans votre appel à' super() 'ne devrait pas compiler. – akf

+0

Quitter la publication croisée: http://forums.sun.com/thread.jspa?threadID=5441271&tstart=0. Passez plus de temps à poser une bonne question avec le code à l'appui et moins de temps à poster. Vous n'avez toujours pas produit un SSCCE approprié et par conséquent vous n'avez toujours pas votre réponse. – camickr

Répondre

1

La raison pour laquelle ils ne coûtent pas montrer est parce que vous appelez probablement le showCourseListDialog() statique pour montrer votre boîte de dialogue. Cette méthode va tester si votre courseListDialog statique est null, et si oui, en créer un et définir que boîte de dialogue visible, pas le clf que vous avez instancié.

Si dans votre showCourseListDialog() vous appelez la méthode addCourses() après instanciation votre « singleton », vous devriez être OK:

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

Cela dit, en ayant le staticcourseListDialog, il est évident que vous voulez que dialogue être un singleton. Si tel est le cas, je voudrais au moins rendre votre constructeur private. Vous voulez éviter de manière proactive la situation dans laquelle vous vous trouvez et où vous pouvez construire plusieurs instances d'un singleton. Vous auriez toujours une condition de concurrence à traiter dans votre showCourseListDialog, mais comme vous n'appellerez cette méthode que dans l'EDT, vous devriez être en sécurité.

Jetez un oeil à this et d'autres sujets sur le développement Singleton en Java (et à ne pas oublier de lire les con arguments où il est décrit comme un anti-modèle)

+0

merci akf pour votre suggestion. oui c'était l'état de la course dans deux classes différentes. Je l'ai eu à travailler :-) THanks pour le lien Singleton aussi. –