Close one JFrame without closing another?

JavaSwingJframe

Java Problem Overview


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.

How can I do that?

Java Solutions


Solution 1 - Java

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.

Solution 2 - Java

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);
				}
			}
		});

	}
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionKeatingView Question on Stackoverflow
Solution 1 - JavaPeter LangView Answer on Stackoverflow
Solution 2 - JavaLaurent KView Answer on Stackoverflow