【问题标题】:Problem updating JPanel in JDialog with JComboBox使用 JComboBox 在 JDialog 中更新 JPanel 时出现问题
【发布时间】:2011-07-28 15:35:03
【问题描述】:

我创建了一个 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();

    }

}

}

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

【问题讨论】:

  • validate()代替updateUI()怎么样?
  • 永远不会在应用程序代码中调用 updateUI 来“更新”任何内容,该方法独家供 LAF 使用
  • 我瞎了,还是 if 和 else-if 的条件完全一样?
  • 是的,kleopatra,这是一个错误,但改变它仍然不能解决问题
  • 没说会 - Rob (@camickr) 发现了真正的问题 ;-) 并删除了那些 updateUI 调用 - never 帮助

标签: java swing jpanel jcombobox jdialog


【解决方案1】:

它应该根据 JComboBox 中选择的值显示不同的内容。

阅读 How to Use Card Layout 上的 Swing 教程中的部分,其中有一个工作示例,可以完全满足您的需求。

编辑:

dialog.panel_1 = dialog.panel_item_1; 

真正的问题是,您不能只更改对变量的引用并期望组件显示在面板上。在面板上执行 revalidate() 之前,您仍然需要将组件添加到面板。所以你的代码是这样的:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-03
    • 2023-03-10
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多