JComobox не отображается в JDialog - PullRequest
0 голосов
/ 05 июня 2010

У меня есть 2 класса. когда я добавляю жирные 3 строки в метод addCourses (), диалоговое окно не отображает комбинированный список в панели но когда я удаляю из addCourses и помещаю эти жирные линии в конструктор, JComboBox отображаются на панели.

Но данные не будут отображаться, поскольку обновления элементов данных в 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);
    }
}

1 Ответ

1 голос
/ 05 июня 2010

Причина, по которой они не отображаются, заключается в том, что вы, вероятно, вызываете статический showCourseListDialog(), чтобы показать свой диалог.Этот метод проверяет, является ли ваш статический courseListDialog нулевым, и, если это так, создайте его и установите , чтобы диалоговое окно было видимым, а не clf, который вы создали.

Если в вашем showCourseListDialog() вы вызываете метод addCourses() после создания экземпляра своего 'singleton', вы должны быть в порядке:

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

Тем не менее, имея static courseListDialog, очевидно, что вы хотите, чтобы этот диалог был единичным.Если это так, я бы по крайней мере сделал бы ваш конструктор private.Вы хотите активно избегать ситуации, в которую вы попадаете, когда вы можете создать несколько экземпляров синглтона.В вашем showCourseListDialog вы все равно будете иметь условие гонки, но поскольку вы будете вызывать этот метод только в EDT, вы должны быть в безопасности.

Взгляните на this и другие темы по разработке Singleton в Java (и не забудьте прочитать аргументы con * , где это описано как анти-шаблон)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...