Java 使用JComboBox更新JDialog中的JPanel时出现问题
我创建了一个JDialog,其中包含一个JComboBox和一个面板,面板下面应该根据JComboBox中选择的值显示不同的内容。我已经创建了一个JPanel(panel_1),它被添加到对话框的内容窗格中,并为JComboBox中的每个可能项目创建了一个额外的JPanel(例如panel_item_1和panel_item_2,如果它只有2个项目)。我在JComboBox中附加了以下侦听器类: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
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();