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