Close one JFrame without closing another?

前端 未结 2 589
自闭症患者
自闭症患者 2020-11-27 16:37

I want to display two (or more) JFrames at the same time.
When I close one of them (use the default close button), the other frames should still be visible.

相关标签:
2条回答
  • 2020-11-27 17:32

    If you do not want your application to terminate when a JFrame is closed, use

    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE)
    

    instead of

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    

    From the documentation:

    • DO_NOTHING_ON_CLOSE (defined in WindowConstants): Don't do anything; require the program to handle the operation in the windowClosing method of a registered WindowListener object.
    • HIDE_ON_CLOSE (defined in WindowConstants): Automatically hide the frame after invoking any registered WindowListener objects.
    • DISPOSE_ON_CLOSE (defined in WindowConstants): Automatically hide and dispose the frame after invoking any registered WindowListener objects.
    • EXIT_ON_CLOSE (defined in JFrame): Exit the application using the System exit method. Use this only in applications.

    This was my answer before the question was clarified, might still be useful:

    You can use setVisible(false) on your JFrame if you want to display the same frame again.
    Otherwise call dispose() to remove all of the native screen resources.

    0 讨论(0)
  • 2020-11-27 17:33

    Does it help you ?

    import java.awt.BorderLayout;
    
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class TwoJFrames {
        public static void main(String[] args) {
            int nb = 4;
            if (args != null && args.length > 0) {
                nb = Integer.parseInt(args[0]);
            }
    
            final int frameCount = nb;
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    for (int i = 0; i < frameCount; i++) {
                        JFrame frame = new JFrame("Frame number " + i);
                        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                        JPanel p = new JPanel(new BorderLayout());
                        p.add(new JLabel("Click on the corner to close..."), BorderLayout.CENTER);
                        frame.setContentPane(p);
                        frame.setSize(200, 200);
                        frame.setLocation(100 + 20 * i, 100 + 20 * i);
                        frame.setVisible(true);
                    }
                }
            });
    
        }
    }
    
    0 讨论(0)
提交回复
热议问题