开发者

How to quit or exit slave JWindow that was created from a master JWindow in Java?

开发者 https://www.devze.com 2023-04-06 23:20 出处:网络
How can i exit only they new MainGame that i created from Main? Wher开发者_JAVA技巧e Main is having an original layer of game. And the MainGame was a dialog window (such as modal windows).

How can i exit only they new MainGame that i created from Main? Wher开发者_JAVA技巧e Main is having an original layer of game. And the MainGame was a dialog window (such as modal windows).

Main.java: (main code)

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);             
  }
}

MainGame.java: (this was extended by Main, and i would like to quite this only).

public class MainGame extends JWindow 
{
  private static JWindow j;
  public MainGame()
  { 
    // some GUI ... 
  }

  public static void runit()
  {
    j = new MainGame();
    j.setVisible();

  }
}


1) better would be implements CardLayout, as create Top-Level Container for new Window, then you'll only to switch betweens Cards

2) don't create lots of Top-Level Container on Runtime, because there are still in JVM memory untill current instance exist,

  • create required number of and re-use that, to avoiding possible memory lacks

  • then you have to call setVisible(false) and setVisible(true)

  • JWindow missed methods for setting setDefaultCloseOperation(Whatever);

3) if you'll create constructor public JWindow(Frame owner), then you'll call directly

SwingUtilities.getAccessibleChildrenCount() and SwingUtilities.getWindowAncestor()

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();
            }
        });
    }
}


I did not go really into your design. but there is 'j.dispose();'. this should work. here is the java documentation.

notice:

  • dispose(); - deletes the window from memory.
  • setVisibilty(false); - just hides it from the screen.
  • You can override the 'dispose()' function to do some stuff while the widow is closing (updating scores if its a game) but at the end of the overriden function you have to call 'super.dispose();' so the function of the class Window is called.


And the MainGame was a dialog window

But thats not what your code uses. You use a JWindow.

You should be using a JDialog for a modal window. Then you just dispose() the window.

0

精彩评论

暂无评论...
验证码 换一张
取 消