如何在不退出应用程序的情况下根据JPanel上的事件关闭特定的JFrame?

use*_*304 3 java swing multiple-instances jpanel jframe

如何在不退出整个应用程序的情况下基于该特定帧内的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);
}
Run Code Online (Sandbox Code Playgroud)

在我的FightScene类中,我正在绘制一个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?                    
            }
        }
Run Code Online (Sandbox Code Playgroud)

Dav*_*amp 9

设置JFrame#setDefaultCloseOperationJFrame.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);
Run Code Online (Sandbox Code Playgroud)

现在关闭框架只需:

frame.dispose();//close the `JFrame` instance
Run Code Online (Sandbox Code Playgroud)

更新:

我理解但是如何触发这个withing FightScene()(这是一个JPanel)?

将实例传递JFrameJPanelvia 构造函数setter

要么

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

JFrame frame = (JFrame) SwingUtilities.getWindowAncestor(this);
frame.dispose();
Run Code Online (Sandbox Code Playgroud)

  • 比传递框架的实例更清洁:``getTopLevelAncestor().setVisible(false)`` (2认同)