Как выйти или выйти из подчиненного JWindow, который был создан из основного JWindow в Java? - PullRequest
1 голос
/ 22 сентября 2011

Как я могу выйти только из новой MainGame, которую я создал из Main?Где Main имеет оригинальный слой игры.И MainGame был диалоговым окном (таким как модальные окна).

Main.java: (основной код)

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: (это было расширено Main, и яхотел бы только этого).

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

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

  }
}

Ответы [ 3 ]

3 голосов
/ 22 сентября 2011

1) лучше бы орудия CardLayout , так как создайте Top-Level Container для нового Window, тогда вам будет только переключаться между картами

2) не создавать много Top-Level Container во время выполнения, потому что в памяти JVM все еще есть, пока не существует текущий экземпляр,

  • создать необходимое количество и использовать его повторно, чтобы избежать возможных нехваток памяти

  • тогда вам нужно позвонить setVisible(false) и setVisible(true)

  • JWindow пропущенные способы настройки setDefaultCloseOperation(Whatever);

3) если вы создадите конструктор public JWindow (Владелец фрейма) , то вы будете вызывать напрямую

SwingUtilities.getAccessibleChildrenCount () и 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();
            }
        });
    }
}
2 голосов
/ 23 сентября 2011

И MainGame был диалоговым окном

Но это не то, что использует ваш код.Вы используете JWindow.

Вы должны использовать JDialog для модального окна.Тогда вы просто распоряжаетесь () окном.

2 голосов
/ 22 сентября 2011

Я действительно не пошел в ваш дизайн. но есть «j.dispose ();». это должно работать. здесь - документация по Java.

уведомление:

  • Dispose (); - удаляет окно из памяти.
  • setVisibilty (ложь); - просто скрывает это от экрана.
  • Вы можете переопределить функцию 'dispose ()', чтобы делать какие-то вещи, пока вдова закрывается (обновляет счет, если это игра), но в конце переопределенной функции вы должны вызвать 'super.dispose ();' поэтому вызывается функция класса Window.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...