如何在 JPanel 上的事件中关闭特定的 JFrame 而不退出应用程序?

3
如何在一个包含JPanel的特定框架中基于模拟退出该特定框架而不退出整个应用程序?
在我的主类中,我有一个Frame()方法。
public void FightFrame(String offensemsg){      

    JFrame frame = new JFrame("BattleView: ");
    frame.setLayout(new BorderLayout());
    FightScene sc = new FightScene();       
    frame.add(sc);
    frame.setVisible(true);
    frame.setSize(652, 480);
    frame.setLocationRelativeTo(null);
    frame.setResizable(false);
    sc.GenerateScene(offensemsg);
}

在我的FightScene类中,我正在绘制一场战斗场景,该类还具有checkCollision()方法。
      public void checkCollisions() {
           for (int i = 0; i < defense.size(); i++) {
                FriendlyEntity m = (FriendlyEntity) defense.get(i);    
                Rectangle r1 = m.getBounds();    
                for (int j = 0; j<offense.size(); j++) {
                    Enemy a = (Enemy) offense.get(j);
                    Rectangle r2 = a.getBounds();    
                    if (r1.intersects(r2)) {
                        m.setHealth(-1);
                        a.setHealth(-1);
                        if(a.getHealth()==0){
                        a.setVisible(false);
                        } else if(m.getHealth()==0){
                            m.setVisible(false);
                            }                       
                }}
           }               
           if(defense.size()==0){                   
                System.out.println("You have lost the battle\n");
                //############ How can I exit the FightFrame from here?
            }else if (offense.size()==0){
                System.out.println("You have won the battle\n");
            //############# How can I exit the FightFrame from here?                    
            }
        }

3
请查看 The Use of Multiple JFrames, Good/Bad Practice? - Andrew Thompson
2个回答

10

JFrame#setDefaultCloseOperation设置为JFrame.DISPOSE_ON_CLOSE

JFrame frame=new JFrame();//create frame

//so when we exit or dispose of Jframe it doesnt exit the entire app
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

...

frame.pack();
frame.setVisible(true);

现在,要关闭框架,只需执行以下操作:

frame.dispose();//close the `JFrame` instance

更新:

我理解了,但是如何在 FightScene()(一个 JPanel)中触发它?

通过 构造函数 或者 setterJFrame 的实例传递给 JPanel

或者

如果您不想在 JPanel 类/方法中使用实例,请执行以下操作:

JFrame frame = (JFrame) SwingUtilities.getWindowAncestor(this);
frame.dispose();

1
如果没有定义任何内容,则HIDE_ON_CLOSE是默认的关闭操作== setVisible(false),我将会在“关闭时什么也不做”或添加WindowListener以防止... - mKorbel
1
@user2556304,你是使用计时器还是线程?如果是的话,必须停止它,否则它会继续运行。或者,将Thread/timer作为观察者,即它查看JFrame是否可见,如果可见,则继续运行,否则退出。当然,现在必须确保在计时器启动时JFrame是可见的... - David Kroukamp
2
比传递框架实例更简洁:getTopLevelAncestor().setVisible(false) - Tim Boudreau
@TimBoudreau +1,另一种方法是查看我的更新,其中显示了 JFrame frame = (JFrame) SwingUtilities.getWindowAncestor(this);,不过你的 setVisible(false) 我不太确定。 - David Kroukamp
1
谢谢你的提示,兄弟。我完全忘记了计时器。 - user2556304
显示剩余6条评论

0

((Frame)FightScene.this.getTopLevelAncestor()).dispose(); // FightScene 是 JPanel


欢迎来到stackoverflow。考虑添加更多的解释。 - Olivier De Meulder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接