单个java代码中的多个JFrame

时间:2014-06-28 13:16:54

标签: java swing jframe multiple-instances

我的java代码中有两个JFrame,当我关闭一帧时,第二帧自动关闭,请告诉我如何使它们彼此独立?

我的代码是这样的:

JFrame frame1 = new JFrame();
JFrame frame2 = new JFrame();

frame1.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame1.setUndecorated(true);
frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame1.setVisible(true);

frame2.setSize(200,100);
frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame2.setVisible(true);

2 个答案:

答案 0 :(得分:3)

你的是一个常见的Swing新手错误,虽然是的,你可以将JFrame默认关闭操作设置为DO_NOTHING_ON_CLOSE,然后你仍然会遇到错误的程序设计。

相反,您几乎不应该一次显示两个JFrame,因为JFrame旨在显示主应用程序窗口,并且大多数应用程序(包括特别是专业应用程序)都没有多个应用程序窗口。相反,做出母亲"窗口一个JFrame,子窗口或依赖窗口是一个JDialog,你的问题解决了,当子窗口关闭时,应用程序必须保持打开状态。 JDialog还有一个额外的好处,就是根据需要允许它是模态的或非模态的。

其他不错的解决方案,包括完全避免多个窗口,包括使用JTabbedPane或CardLayout来交换视图。

请阅读:The use of multiple JFrames, good bad practice


修改
例如

import java.awt.Dialog.ModalityType;
import java.awt.Dimension;    
import javax.swing.*;

public class DialogEx {


   private static void createAndShowGui() {
      JFrame frame1 = new JFrame("DialogEx");
      frame1.setExtendedState(JFrame.MAXIMIZED_BOTH);
      frame1.setUndecorated(true);
      frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame1.setVisible(true);

      JDialog nonModalDialog = new JDialog(frame1, "Non-Modal Dialog", ModalityType.MODELESS);
      nonModalDialog.add(Box.createRigidArea(new Dimension(200, 200)));
      nonModalDialog.pack();
      nonModalDialog.setLocationByPlatform(true);
      nonModalDialog.setVisible(true);

      JDialog modalDialog = new JDialog(frame1, "Modal Dialog", ModalityType.APPLICATION_MODAL);
      modalDialog.add(Box.createRigidArea(new Dimension(200, 200)));
      modalDialog.pack();
      modalDialog.setLocationByPlatform(true);
      modalDialog.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

答案 1 :(得分:1)

这是因为您将两个帧的默认关闭操作设置为EXIT_ON_CLOSE,因此无论您单击哪个帧的关闭按钮,该程序都会退出。对于您的主框架,您可以将其设置为EXIT_ON_CLOSE,而对于其他框架,您可以将其设置为DO_NOTHING_ON_CLOSE

此外,正如其他人建议使用JDialog而不是多个框架。