Java桂开二windows

Java Gui opening two windows

首先,我是 Java GUI 的新手,所以请多多包涵。 我正在从模型-视图-控制器设置中创建一个非常简单的 GUI,它所做的只是显示一些标签、一些文本字段和一些按钮;没有什么花哨。我已经通过 GridBagLayout 获得了我想要的 GUI,但我遇到的问题是每当我调用 GUI 视图 class 时,我都会弹出两个 windows,而不是一个。第一个 window 打开的是带有我所有文本字段和按钮的 GridBagLayout,第二个只是一个很小的 ​​window 东西,只有最小化、最大化和关闭按钮(附上一张照片)。

我的代码如下(模型和控制器还有另外两个classes)

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 在另一个 class 中是这样调用的,连同 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);   
   }
}

我知道这可能很简单,但我做错了什么?我如何抑制这一秒 window?

提前致谢!

classView extends JFrame.And在classView中你再创建一个JFrame,mFrame.The可见的两个JFrame是true.So你会看到两个window。尝试删除代码"view.setVisible(true);" 在类 GUIBasics 中。

根据您的代码,您的 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 命名约定。

您的 class 几乎没有充分理由扩展 JFrame。您的 class 应该扩展 JPanel。然后在 main() 函数中创建一个 JFrame,创建 class 实例,将其添加到框架中,打包框架并将其设置为可见。这也应该全部在事件线程上完成,而不是主线程:

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 实例的一行即可。