用Java关闭GUI

时间:2014-05-01 22:29:37

标签: java swing user-interface jframe

import javax.swing.JFrame;


public class Driver00

{

   public static void main(String[] args)

   {
        /*Create a frame (outside box) and write what text 
   will be displayed as the frame title*/ 
      JFrame frame = new JFrame("Casino Blackjack");
      JFrame frame2 = new JFrame("Rules and Information");
      //allows JFrame to be maximiazed on open
      frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
      frame2.setExtendedState(JFrame.MAXIMIZED_BOTH);

   //give frame a size
     // frame.setSize(2000,2000);

   //set location on the computer screen will frame appear
      //frame.setLocation(200, 150);

    //use this so when you press X in corner, frame will close
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       //frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

   //Add your panel to the frame. name must match Panel class name
      frame.setContentPane(new PanelProject());
      frame2.setContentPane(new Rules());

   // always include
      frame.setVisible(true);
      frame2.setVisible(true);
   }
}

这是启动我的GUI的应用程序,我的问题是,如果我没有注释掉frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);行并点击x按钮,它会同时关闭{{1} }和frame。它也是另一种方式。如果我没有注释掉frame2而不是frame的同一行,并点击frame2按钮,它会关闭两个帧。

我希望能够关闭框架或其他框架,而不必担心两个框架都被关闭。

3 个答案:

答案 0 :(得分:3)

  

“我希望能够关闭框架或其他框架,而不必担心两个框架都被关闭。”

首先,您需要查看The Use of Multiple JFrames, Good/Bad Practice?。只是强调,大多数选民倾向于“坏”方面。

话虽这么说,你应该考虑你的帧的语义。即仅为游戏说明打开另一帧。这似乎是合理的,但如果您理解modality,您可能会同意,对于此场景使用辅助帧,模式JDialog会更合适,因为主要游戏框架的交互当指令对话框打开时,将被阻止。请点击How to Make Dialogs

了解更多信息

如果您不想使用两个单独的窗口,另一个选项是使用CardLayout。这将允许您在视图之间切换。因此,当提示说明时,游戏将移出视图,并将指令放入视图中。反之亦然。您可以在How to use CardLayout查看更多信息。另请参阅一个简单示例here

答案 1 :(得分:1)

DISPOSE_ON_CLOSE 要么 System.exit(0);

您也可以在x的点击上设置可见性,将其设置为false,使其看起来已关闭。然后当应用程序完成时,x将关闭两个

答案 2 :(得分:0)

  1. 为什么你的JFrames都属于一个班级?您应该将GUI逻辑分开,以便一个屏幕等于一个类。它可以实现更好的管理,特别是如果那些JFrames变得更复杂。

  2. 如果您的框架被分隔成单独的类,则以下代码可以正常工作:

    // this is important
    mainFrame.setDefaultCloseOperation(
            WindowConstants.DO_NOTHING_ON_CLOSE);
    
    mainFrame.addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
            // mainFrame being the frame you want to close
            mainFrame.setVisible(false);
            mainFrame.dispose();
        }       
    });
    
  3. System.exit(0)用于关闭整个程序,这不是您想要的。

  4. 但是,如果您将JFrames同时保留在一个班级中,则需要添加一些逻辑,以便如果只剩下一个JFrame,则需要完全关闭程序。

    尽管如此,无论如何都包括它可能是有用的。

    我提供这个作为@peeskillet答案的替代品,因为它需要你的工作量更少。但是,我建议您自己阅读答案并自行研究,因为 非常重要:)

    (我自己使用多个JFrames,并且只是将其视为体面的对象管理问题,以便有效地维护它们。

    修改

      

    4 ::为什么我更喜欢设置自定义WindowListener而不是使用DISPOSE_ON_CLOSE,这仅仅是因为我经常有与程序关闭相关的自定义代码。我发现它给了我更多的创作自由。

         

    您可能会发现DISPOSE_ON_CLOSE更适合您。

    EDITEDIT :StackOverflow处理列表的方式很蠢。