JComboBox ссылается на старый фрейм, а removeAllItems ()

1

Я попытался понять это сам, но не могу. Я застрял в странной проблеме.

У меня есть Java-программа с несколькими классами и формами (я использую Intellij и сборку в GUI-Creator). Когда я переключаюсь с одного экрана на другой, я просто вызываю frame.setVisible(false); в frame.setVisible(true); окне и frame.setVisible(true); в окне я хочу показать следующее.

На кнопке Click Я делаю это:

В классе 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);

        }

И поэтому он пытается обновить старый фрейм из класса 2, который больше не существует из-за нового, который я только что создал. Итак, у меня есть 2 кадра: один, как я хочу, и один странный старый фрейм с классом2.

Моя проблема в том, что я хочу связать свой JComboBox с новым фреймом и обновить его, но он все еще связан со старым, и это вызывает такие странные проблемы, как возврат к функции. Я имею в виду, что она находится на последней строке goToMainWindow() а затем она начинается с первой строки.

  • 2
    Перейдите через этот сайт в туре и помощь центра разделов для получения информации о том , как улучшить свой вопрос и , возможно , сделать его к ответственности. И добро пожаловать в ТАК кстати.
Теги:
intellij-idea
swing
jcombobox

1 ответ

2
  1. Во-первых, вы должны избегать обмена JFrames, как ваша программа, так как это очень раздражает дизайн графического интерфейса. Пожалуйста, прочитайте "Использование нескольких JFrames, Good/Bad Practice? для получения дополнительной информации об этом.
  2. Далее, мы не можем сказать, с каким графическим интерфейсом связан ваш JComboBox.
  3. Но, сказав это, это действительно не имеет значения. Вместо того, чтобы делать то, что вы делаете, я бы дал класс отображения, в котором JCombBox представляет собой общедоступный метод, который вы вызываете в содержащем классе отображения, который очищает содержащуюся модель JComboBox или помещает элементы в модель. Таким образом, не будет никакой двусмысленности относительно того, к какому JComboBox вы обращаетесь, и таким образом вы избегаете прямого раскрытия внутренних компонентов представления.
  4. В стороне я стараюсь использовать свой дисплей или классы для создания JPanels, а не JFrames, так как это даст моему коду гораздо большую гибкость.

Например

// 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 на дисплее, который отображается, вызывая его собственный метод для очистки собственной модели combobox.

  • 0
    Большое спасибо. Наш Профессор не сказал нам этого. Извините за мой плохой стиль кодирования, я прочитаю эту ссылку.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню