JComboBox引用旧框架而removeAllItems()

时间:2014-12-01 18:07:57

标签: java swing intellij-idea jcombobox removeall

我试图自己解决这个问题,但我不能。我遇到了一个奇怪的问题。

我有一个包含多个类和表单的Java程序(我使用Intellij和GUI-Creator中的构建)。当我从一个屏幕切换到另一个屏幕时,我只需在翻转窗口调用frame.setVisible(false);,然后在我想要显示的窗口调用frame.setVisible(true);

在按钮上单击我这样做:

在第1课:

if (e.getSource() == umschaltenButton) {
            this.mainW.goToMainWindow();
            logger.log(Level.INFO, "Switched Back to MainMenu");
            frame.setVisible(false);
        }

这是奇怪的部分。

在第2课:

public void goToMainWindow() {

            frame = tvElectronics.drawMainWindow(); // I get a new Frame with new Images and so on
            frame.addMouseListener(al);
            frame.add(BotomPanel);  // in here is the JComboBox
            frame.setSize(LENGTH, HEIGHT);

            comboBox1.removeAllItems(); // Here it tryes to refere to the old frame before i made frame = tvElectronics.drawMainWindow();
            Vector<String[]> content = tvElectronics.getContent();

            for (int i = 0; i < tvElectronics.getAnz(); ++i) {
                comboBox1.addItem((i + 1) + ". " + content.get(i)[3]);
            }
            comboBox1.setSelectedIndex(chanel);

            frame.setVisible(true);

        }

因此它尝试更新class2中的旧框架,因为我刚创建的旧框架不再存在。所以我打开了2个框架:一个是我想要的,一个奇怪的旧框架形成class2。

我的问题是我希望将我的JComboBox绑定到一个新的框架并更新它但它仍然连接到旧框架,这会导致奇怪的问题,比如跳回到函数中。我的意思是它位于goToMainWindow()的最后一行,然后它再次从第一行开始。

1 个答案:

答案 0 :(得分:2)

  1. 首先,你应该避免像程序那样交换JFrame,因为这是一个非常讨厌的GUI设计。有关详细信息,请阅读The Use of Multiple JFrames, Good/Bad Practice?
  2. 接下来,我们无法分辨您的JComboBox与哪个GUI视图相关联。
  3. 但话说回来,这真的不重要。我没有做你正在做的事情,而是给显示类保存JCombBox一个公共方法,你可以在包含的显示类上调用来清除包含的JComboBox的模型或者将项放在模型中。这样,您所指的JComboBox就不会有歧义,这样就可以避免直接暴露视图的内部组件。
  4. 顺便说一下,我尝试设置我的显示器或查看类来创建JPanels,而不是JFrames,因为这将为我的代码提供更大的灵活性。

  5. 例如

    // my display class
    class Display1 {
       private DefaultComboBoxModel<String> myModel = new DefaultComboBoxModel<>();
       private JComboBox<String> myCombo = new JComboBox<>(myModel);
    
       public void removeAllComboElements() {
          myModel.removeAllElements();
       }
    
       public void addElement(String ele) {
          myModel.addElement(ele);
       }
    
    }
    

    您的Display2课程相同。然后,您可以在正确的视图/显示所持有的JComboBox上调用正确的方法。

    这样,当您交换显示时,可能通过使用CardLayout,您可以通过调用自己的方法来清除显示的JComboBox,以清除其自己的组合框模型。