2016-05-25 2 views
0

Во-первых, я новичок в Java GUI, поэтому, пожалуйста, несите меня. Я создаю довольно простой графический интерфейс из установки Model-View-Controller, и все, что он делает, это отображение некоторых ярлыков, некоторых текстовых полей и некоторых кнопок; ничего особенного. У меня есть GUI, который выглядит так, как я хочу с GridBagLayout, но проблема в том, что всякий раз, когда я вызываю класс представления GUI, у меня появляется два окна, а не один. Первое окно, которое нужно открыть, это GridBagLayout со всеми моими текстовыми полями и кнопками, а второе - просто маленькое окошко с кнопками минимизации, максимизации и закрытия (прикреплено к фотографии). Annoying pop-up windowJava Gui открывает два окна

Мой код выглядит следующим образом (есть два других классов для модели и контроллера)

public class classView extends JFrame { 

    private classModel model; 

    public classView(classModel model){ 
     this.model = model; 
     JFrame mFrame = new JFrame("This is the view Frame"); 

     mFrame.setBounds(400, 400, 300, 300); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     addComponentsToPane(mFrame.getContentPane()); 
     mFrame.pack(); 
     mFrame.setVisible(true); 
     } 

    private void addComponentsToPane(Container pane){ 
     // This is where I add the buttons and other fun stuff 
    } 

ClassView называется, как это в другом классе, наряду с classController и classModel.

public class classGUIBasics { 
    public static void main(String[] args) throws Exception { 
    classModel model = new classModel(); 
    classView view = new classView(model); 
    new classController(model, view); 
    view.setVisible(true); 
    } 
} 

Я знаю, что это, вероятно, что-то простое, но что я делаю неправильно? Как подавить это второе окно?

Заранее благодарен!

ответ

0

В соответствии с вашим кодом classView расширяет JFrame, поэтому на самом деле classView является JFrame, поэтому ваш вид имеет все свойства JFrame.

Так что ваш код может быть изменен на:

class classView extends JFrame { 

    private classModel model; 

    public classView (classModel model) { 
     this.model = model; 

     this.setBounds(400, 400, 300, 300); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     addComponentsToPane(); 
     this.pack(); 
    } 

    private void addComponentsToPane () { 
     Container pane = this.getContentPane(); 
     // This is where I add the buttons and other fun stuff 
    } 

} 

И ваши classGUIBasics остается прежним:

public static void main (String[] args) throws Exception { 
    classModel model = new classModel(); 
    classView view = new classView(model); 
    new classController(model, view); 
    view.setVisible(true); 
} 

Кроме того, я бы рекомендовал проверить именования Java.

+0

Ahh отлично. Работает как шарм. Спасибо друг! – flexcookie

0

classView расширяет JFrame.And в классеView вы создаете другой JFrame, mFrame. Видимый из двух JFrame является true.So вы увидите два окна. Попробуйте удалить код «view.setVisible (true)»; в классе GUIBasics.

+0

Да, это исправлено. Есть ли все-таки сделать это со стороны classView? Cheers – flexcookie

0

Практически никогда не будет веской причины для расширения вашего класса JFrame. Ваш класс должен расширить JPanel. то в функции main() вы создаете JFrame, создаете экземпляр класса, добавляете его в фрейм, ставите фрейм и устанавливаете его видимым. это также должно быть сделано на нить событий, а не основной поток:

public class MyClass extends JPanel { 

    public MyClass() { 
     // create the contents of the panel 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     // other stuff here 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      JFrame jf = new JFrame(); 
      jf.addWindowListener(new WindowAdapter() { 
       @Override 
       public void windowClosing(WindowEvent arg0) { 
        System.exit(0); 
       } 
      }); 
      MyClass t = new MyClass(); 
      jf.add(t, BorderLayout.CENTER); 
      jf.pack(); 
      jf.setVisible(true); 
     } 
     }); 
    } 
} 

Обратите внимание, что этот основной метод может быть повторно использован для любого из ваших приложений, просто изменив одну строку, которая создает экземпляр MyClass.

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