Java 使用JComboBox更新JDialog中的JPanel时出现问题

Java 使用JComboBox更新JDialog中的JPanel时出现问题,java,swing,jpanel,jcombobox,jdialog,Java,Swing,Jpanel,Jcombobox,Jdialog,我创建了一个JDialog,其中包含一个JComboBox和一个面板,面板下面应该根据JComboBox中选择的值显示不同的内容。我已经创建了一个JPanel(panel_1),它被添加到对话框的内容窗格中,并为JComboBox中的每个可能项目创建了一个额外的JPanel(例如panel_item_1和panel_item_2,如果它只有2个项目)。我在JComboBox中附加了以下侦听器类: public class SelectedListener implements ActionLis

我创建了一个JDialog,其中包含一个JComboBox和一个面板,面板下面应该根据JComboBox中选择的值显示不同的内容。我已经创建了一个JPanel(panel_1),它被添加到对话框的内容窗格中,并为JComboBox中的每个可能项目创建了一个额外的JPanel(例如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();

    }

}
}

但是,这不会使面板更新为新内容。有什么建议吗?提前谢谢

它将根据在JComboBox中选择的值显示不同的内容

阅读Swing教程中的部分,其中有一个工作示例,可以完全满足您的需要

编辑:

真正的问题是,您不能仅仅更改对变量的引用,而期望组件显示在面板上。在对面板执行重新验证()之前,仍然需要将组件添加到面板中。因此,您的代码如下所示:

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

但是,更好的解决方案是使用CardLayout,它可以为您完成所有这些工作。

使用
validate()
而不是
updateUI()
?永远不要在应用程序代码中调用updateUI来“更新”任何内容,该方法仅供LAFme blind使用,或者在if和else if中的条件完全相同吗?是的,克利奥帕特拉,这是一个错误,但改变这一点仍然不能解决问题。我不认为这会解决问题——罗布(@camickr)发现了真正的问题;-)并删除那些updateUI调用-永不帮助
panel.remove(...);
panel.add(...);
panel.revalidate();
panel.repaint();