Проблема обновления JPanel в JDialog с JComboBox - PullRequest
2 голосов
/ 28 июля 2011

Я создал JDialog, который содержит JComboBox и панель под ним, которая должна отображать другое содержимое в зависимости от значения, выбранного в JComboBox. Я создал JPanel (panel_1), который добавляется на панель содержимого диалогового окна и дополнительный JPanel для каждого из возможных элементов в JComboBox (например, panel_item_1 и panel_item_2, если в нем только 2 элемента). Я прикрепил следующий класс слушателя в JComboBox:

public class SelectedListener implements ActionListener {

private SettingsDialog dialog;

public SelectedListener(SettingsDialog dialog){

    this.dialog = dialog;

}

public void actionPerformed(ActionEvent e) {

   JComboBox cb = (JComboBox)e.getSource();
       String selected_settings = (String)cb.getSelectedItem();

       if(selected_settings.compareTo("Option 1") == 0){

        dialog.panel_1 = dialog.panel_item_1;
        dialog.panel_1.updateUI();

    }else if(selected_settings.compareTo("Option 2") == 0 ){

        dialog.panel_1 = dialog.panel_item_2;
        dialog.panel_1.updateUI();

    }

}

}

Однако это не заставляет панель обновляться с новым содержанием. Любое предложение? Заранее спасибо

1 Ответ

4 голосов
/ 28 июля 2011

, который должен отображать другое содержимое в зависимости от значения, выбранного в JComboBox.

Прочитайте раздел из учебника по Swing на Как использовать макет карты , которыйесть рабочий пример, который делает именно то, что вы хотите.

Редактировать:

dialog.panel_1 = dialog.panel_item_1; 

Реальная проблема в том, что вы не можете просто изменить ссылку на переменную и ожидать, что компонент покажетна панели.Вам все еще нужно добавить компонент на панель, прежде чем выполнять revalidate () на панели.Ваш код выглядит так:

panel.remove(...);
panel.add(...);
panel.revalidate();
panel.repaint();

Однако лучшее решение - использовать CardLayout, который сделает всю эту работу за вас.

...