2014-12-01 3 views
1

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

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

     } 

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

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

+2

Просьба ознакомиться с разделами [tour] и [help] этого сайта, чтобы узнать, как улучшить свой вопрос и, возможно, привлечь его к ответственности. И, кстати, добро пожаловать в SO. –

ответ

2
  1. Прежде всего, вам следует избегать обмена JFrames, поскольку ваша программа делает это, поскольку это очень раздражает дизайн графического интерфейса. Пожалуйста, прочитайте The Use of Multiple 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

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

Смежные вопросы