Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何退出或退出从Java主JWindow创建的从属JWindow?_Java_Swing_User Interface - Fatal编程技术网

如何退出或退出从Java主JWindow创建的从属JWindow?

如何退出或退出从Java主JWindow创建的从属JWindow?,java,swing,user-interface,Java,Swing,User Interface,我怎样才能只退出我从Main创建的新MainGame? 其中主要是有一个原始的游戏层。主游戏是一个对话框窗口(比如模态窗口) java:(主代码) java:(这是由Main扩展的,我只想解释一下) 我并没有真正了解你的设计。但是还有“j.dispose();”。 这应该行得通。是java文档 注意: dispose();-从内存中删除窗口 设置可视性(假);-只是在屏幕上隐藏它 您可以在寡妇关闭时重写'dispose()'函数来执行某些操作(如果是游戏,则更新分数),但在重写的函数结束时,您

我怎样才能只退出我从Main创建的新MainGame? 其中主要是有一个原始的游戏层。主游戏是一个对话框窗口(比如模态窗口)

java:(主代码)

java:(这是由Main扩展的,我只想解释一下)


我并没有真正了解你的设计。但是还有“j.dispose();”。 这应该行得通。是java文档

注意:

  • dispose();-从内存中删除窗口
  • 设置可视性(假);-只是在屏幕上隐藏它
  • 您可以在寡妇关闭时重写'dispose()'函数来执行某些操作(如果是游戏,则更新分数),但在重写的函数结束时,您必须调用'super.dispose();'因此类窗口的函数被调用

    • 我并没有真正了解你的设计。但是还有“j.dispose();”。 这应该行得通。是java文档

      注意:

      • dispose();-从内存中删除窗口
      • 设置可视性(假);-只是在屏幕上隐藏它
      • 您可以在寡妇关闭时重写'dispose()'函数来执行某些操作(如果是游戏,则更新分数),但在重写的函数结束时,您必须调用'super.dispose();'因此类窗口的函数被调用
      1)最好是实现,因为为新的
      窗口创建
      顶级容器
      ,然后您只需在卡之间切换

      2) 不要在运行时创建大量的顶级容器,因为在当前实例存在之前,JVM内存中仍然有

      • 创建所需数量的内存并重复使用,以避免可能的内存不足

      • 然后必须调用
        setVisible(false)
        setVisible(true)

      • JWindow
        错过了设置
        setDefaultCloseOperation(无论什么)的方法

      3) 如果要创建构造函数,则直接调用

      1) 最好是实现,因为为新的
      窗口创建
      顶级容器
      ,然后您只需要在卡片之间切换

      2) 不要在运行时创建大量的顶级容器,因为在当前实例存在之前,JVM内存中仍然有

      • 创建所需数量的内存并重复使用,以避免可能的内存不足

      • 然后必须调用
        setVisible(false)
        setVisible(true)

      • JWindow
        错过了设置
        setDefaultCloseOperation(无论什么)的方法

      3) 如果要创建构造函数,则直接调用

      主游戏是一个对话窗口

      但这不是您的代码所使用的。你使用一个JWindow

      您应该使用JDialog作为模式窗口。然后你只需处理掉这个窗口

      主游戏是一个对话窗口

      但这不是您的代码所使用的。你使用一个JWindow


      您应该使用JDialog作为模式窗口。然后您只需处理()窗口。

      所有的静态变量是什么?为什么不通过CardLayout交换视图呢?另外,您是否注意在EDT上运行Swing代码?您滥用了“static”关键字的用法。总之,首先:我认为的方法是假设公共静态void main,而不是公共静态void main。其次,在创建MainGame的线程中,可以访问“j”(作为静态变量),调用j.setVisible(false)隐藏窗口。第三,您可以将父JWindow的引用传递给另一个类,这样,一旦另一个类自身初始化,它就会调用JWindow.setVisibile(false)。希望这有帮助。@Usman Saleem:MainGame visible设置为false没有多大帮助。因为在弹出窗口中,我有一个3D电影作为演示文稿播放,所以我想完全关闭jWindow对话框,以便以后可以重播一个新的对话框。@LearnFedora我说的是将“Main”setVisible设置为false。您可以将Main的引用传递给MainGame构造函数。它增加了硬依赖性,但它会满足你的目的。你需要重新设计你的代码,这一切都搞砸了(我诚实的意见)。您不应该尝试从MainGame中重新创建MainGame。所有的静态变量是怎么回事?为什么不通过CardLayout交换视图呢?另外,您是否注意在EDT上运行Swing代码?您滥用了“static”关键字的用法。总之,首先:我认为的方法是假设公共静态void main,而不是公共静态void main。其次,在创建MainGame的线程中,可以访问“j”(作为静态变量),调用j.setVisible(false)隐藏窗口。第三,您可以将父JWindow的引用传递给另一个类,这样,一旦另一个类自身初始化,它就会调用JWindow.setVisibile(false)。希望这有帮助。@Usman Saleem:MainGame visible设置为false没有多大帮助。因为在弹出窗口中,我有一个3D电影作为演示文稿播放,所以我想完全关闭jWindow对话框,以便以后可以重播一个新的对话框。@LearnFedora我说的是将“Main”setVisible设置为false。您可以将Main的引用传递给MainGame构造函数。它增加了硬依赖性,但它会满足你的目的。你需要重新设计你的代码,这一切都搞砸了(我诚实的意见)。您不应该尝试从MainGame.j.dispose()已分发的主类中重新创建MainGame。然后可能是mp.dispose()。您要处理的任何窗口。调用它的函数。它可以从它的内部,如下所示:this.dispose();或者来自另一个类,该类包含对要销毁并调用的窗口的引用:windowObject.dispose();mp.dispose();什么都不做。j.dispose()也已分发给主类。那么可能是mp.dispose()。您要处理的任何窗口。调用它的函数。它可以来自insi
      public class Main extends JWindow
      {
        private static JWindow j;
        public static MainGame mp;
      
        public static void main(String[] args)
        {
              new Thread(new Runnable() 
              {
                public void run()
                {            
                  mp = new MainGame(); 
                  mp.runit();            
                  //mp.stopit();
                }
              }).start();
      
              j = new Main();
              j.setVisible(true);             
        }
      }
      
      public class MainGame extends JWindow 
      {
        private static JWindow j;
        public MainGame()
        { 
          // some GUI ... 
        }
      
        public static void runit()
        {
          j = new MainGame();
          j.setVisible();
      
        }
      }
      
      import javax.swing.*;
      import java.awt.*;
      
      public class Testing {
      
          private JFrame f = new JFrame("Main Frame");
          private JWindow splashScreen = new JWindow();
      
          public Testing() {
              splashScreen = new JWindow(f);
              splashScreen.getContentPane().setLayout(new GridBagLayout());
              JLabel label = new JLabel("Splash Screen");
              label.setFont(label.getFont().deriveFont(96f));
              splashScreen.getContentPane().add(label, new GridBagConstraints());
              splashScreen.pack();
              splashScreen.setLocationRelativeTo(null);
              splashScreen.setVisible(true);
              new Thread(new Runnable() {
      
                  @Override
                  public void run() {
                      readDatabase();
                      SwingUtilities.invokeLater(new Runnable() {
      
                          @Override
                          public void run() {
                              createAndShowGUI();
                          }
                      });
                  }
              }).start();
          }
      
          public void readDatabase() {
              //simulate time to read/load data - 10 seconds?
              try {
                  Thread.sleep(2000);
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
      
          public void createAndShowGUI() {
              JLabel label = new JLabel("My Frame");
              label.setFont(label.getFont().deriveFont(96f));
              f.add(label);
              f.setLocationRelativeTo(null);
              f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              f.pack();
              f.setVisible(true);
              System.out.println("JFrame getAccessibleChildrenCount count -> "
                      + SwingUtilities.getAccessibleChildrenCount(f));
              System.out.println("JWindow getParent -> "
                      + SwingUtilities.getWindowAncestor(splashScreen));
              splashScreen.dispose();
          }
      
          public static void main(String[] args) {
              SwingUtilities.invokeLater(new Runnable() {
      
                  @Override
                  public void run() {
                      Testing t = new Testing();
                  }
              });
          }
      }