Nebenfenster per "X" schließen. Hauptprogramm soll weiter "laufen"

Hallo Leute,

ich habe mir ein Programm gebastelt: VerschiedeneListener
Es funktioniert alles soweit einwandfrei, bis auf eine Funktion.
Ich möchte dass wenn ich auf den Button “neues Fenster” klicke und ein neues erscheint, was auch funktioniert, dass
wenn ich nun auf das “x” zum schließen des “Nebenfensters” klicke, dass sich dann ausschließlich dieses schließt und das Hauptprogramm weiter läuft. Das funktioniert bisher nicht.

Hier mal mein Ansatz mit dem wichtigsten Code:

public class VerschiedeneListener extends JFrame
{
	private static final long serialVersionUID = 1L;
	JLabel darstellen,groesserkleiner;
	JRadioButton arial,kursiv,fett,Groesser,Kleiner,unsichtbar,sichtbar;
	JButton neuerButton,groesser,kleiner,ursprung,neuePos,anderePos,
	altePos,neuSchrift,alteSchrift;
	JPanel zeichnen;
	JSlider groekle;
	ButtonGroup bg;
	JPanel p1,p2,p3;
	
	public VerschiedeneListener()
	{
		setSize(400, 500);
		setResizable(false);
		setLayout(new GridLayout(14,1));
		setTitle("Verschiedene Listener");
		
		add(darstellen=new JLabel("Darstellen"));
		add(groesserkleiner=new JLabel("Groesser/Kleiner"));
		
		add(groekle=new JSlider(JSlider.HORIZONTAL,0,48,12));
		SliderListener sl=new SliderListener();
		groekle.addChangeListener(sl);
		groekle.setMajorTickSpacing(4);
		groekle.setMinorTickSpacing(1);
		groekle.setPaintLabels(true);
		groekle.setPaintTicks(true);
		
		RadioButtonListener al=new RadioButtonListener();
		bg=new ButtonGroup();
		
		p1=new JPanel();
		p2=new JPanel();
		p3=new JPanel();

		p1.add(arial=new JRadioButton("Arial"));
		arial.addActionListener(al);
		arial.setActionCommand("Arial");
		
		p1.add(kursiv=new JRadioButton("Kursiv"));
		kursiv.addActionListener(al);
		kursiv.setActionCommand("Kursiv");
		
		p1.add(fett=new JRadioButton("Fett"));
		fett.addActionListener(al);
		fett.setActionCommand("Fett");
		
		p1.add(Groesser=new JRadioButton("Groesser"));
		Groesser.addActionListener(al);
		Groesser.setActionCommand("Groesser");
		
		p1.add(Kleiner=new JRadioButton("Kleiner"));
		Kleiner.addActionListener(al);
		Kleiner.setActionCommand("Kleiner");
		
		p2.add(unsichtbar=new JRadioButton("unsichtbar"));
		unsichtbar.addActionListener(al);
		unsichtbar.setActionCommand("unsichtbar");
		
		p2.add(sichtbar=new JRadioButton("sichtbar"));
		sichtbar.addActionListener(al);
		sichtbar.setActionCommand("sichtbar");
		
		
		bg.add(arial);
		bg.add(fett);
		bg.add(kursiv);
		bg.add(Groesser);
		bg.add(Kleiner);
		bg.add(unsichtbar);
		bg.add(sichtbar);
		add(p1);
		add(p2);
		
		ButtonListener bl=new ButtonListener();
		
		add(neuerButton=new JButton("neues Fenster"));
		neuerButton.addActionListener(bl);
		neuerButton.setActionCommand("neues Fenster");
		
		add(groesser=new JButton("groesser"));
		groesser.addActionListener(bl);
		groesser.setActionCommand("groesser");
		
		add(kleiner=new JButton("kleiner"));
		kleiner.addActionListener(bl);
		kleiner.setActionCommand("kleiner");
		
		add(ursprung=new JButton("ursprung"));
		ursprung.addActionListener(bl);
		ursprung.setActionCommand("ursprung");
		
		add(neuePos=new JButton("neue Position"));
		neuePos.addActionListener(bl);
		neuePos.setActionCommand("neue Position");
		
		add(anderePos=new JButton("andere Position"));
		anderePos.addActionListener(bl);
		anderePos.setActionCommand("andere Position");
		
		add(altePos=new JButton("alte Position"));
		altePos.addActionListener(bl);
		altePos.setActionCommand("alte Position");
		
		add(neuSchrift=new JButton("Schrift aendern"));
		neuSchrift.addActionListener(bl);
		neuSchrift.setActionCommand("Schrift aendern");
		
		add(alteSchrift=new JButton("Schrift rueckgaengig machen"));
		alteSchrift.addActionListener(bl);
		alteSchrift.setActionCommand("rueckgaengig");
		
		
		
		setVisible(true);
//		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
	}
	
	public JSlider getGroekle()
	{
		return this.groekle;
	}
	
	public JLabel getGroesserkleiner()
	{
		return this.groesserkleiner;
	}

	protected void processWindowEvent( WindowEvent e )
	{
		if( e.getID() == WindowEvent.WINDOW_CLOSING )
		{
			//Hier wurden schon einige Varianten ausprobiert
			neuerButton.doClick(DISPOSE_ON_CLOSE);
//			this.dispose();
		}
	}

Für Tipps, Ratschläge oder sogar Lösungen wäre ich dankbar.

lg

was dir fehlt ist:

setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

statt JFrame kannst du auch gleich die WindowConstants nutzen.

Als erstes hatte ich das dringelassen. Dann habe ich es aufgrund nicht Funktionierens einmal auskommentiert und dabei belassen.
… Gerade getestet. Es funktioniert auch nicht. Weder mit dem erst noch mit dem zweit genannten. (Im Konstruktor und der Methode getestet)

laut deinem Code da oben benutzt du

EXIT_ON_CLOSE
  • das schließt das ganze Programm.
DISPOSE_ON_CLOSE

schließt nur das Fenster und muss funktionieren. Es sollte aber auch vor dem setVisible() sein.

so zum Bespiel:


import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import javax.swing.border.EmptyBorder;

public class Test extends JFrame
{
	private JPanel contentPane;

	public static void main(String[] args)
	{
		EventQueue.invokeLater(new Runnable()
		{
			@Override
			public void run()
			{
				try
				{
					Test frame = new Test();
					frame.setVisible(true);
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
			}
		});
	}

	public Test()
	{
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
	}
}```

Ich habs jetzt mal mit beiden Varianten ausprobiert. also JFrame und WindowConstants im Konstruktor vor dem setVisible(true).

		
//		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setVisible(true);
		
	}
	
	public JSlider getGroekle()
	{
		return this.groekle;
	}
	
	public JLabel getGroesserkleiner()
	{
		return this.groesserkleiner;
	}

	protected void processWindowEvent( WindowEvent e )
	{
		if( e.getID() == WindowEvent.WINDOW_CLOSING )
		{
			//Hier wurden schon einige Varianten ausprobiert
			neuerButton.doClick(JFrame.DISPOSE_ON_CLOSE);
//			neuerButton.doClick(DISPOSE_ON_CLOSE);
//			this.dispose();
		}
	}

Es funktioniert dennoch nicht…

Ich kann auch gerne mal das ganze Programm posten. Vlt. liegt der Fehler ja noch an einer anderen Stelle, wobei sonst alle Funtionen klappen.

was soll eigentlich das hier machen?

    {
        if( e.getID() == WindowEvent.WINDOW_CLOSING )
        {
            //Hier wurden schon einige Varianten ausprobiert
            neuerButton.doClick(JFrame.DISPOSE_ON_CLOSE);
//          neuerButton.doClick(DISPOSE_ON_CLOSE);
//          this.dispose();
        }
    }```
meiner meinung nach ist das überflüssig.
Guck dir mal mein Bespiel oben an, das geht und da ist sowas nicht drin.
Nimm das mal raus und teste es dann noch einmal.

Am besten nimmst du dir vielleicht erstmal ein "frisches" Fenster ohne Inhalt und wenn das so funktioniert wie du es willst machst du die Buttons etc rein.

für andere Dinge wie Layout streng drauf zu achten,
hierzu ist das aber egal, es wird ein interner Zustand gemerkt der erst 10 sec später beim Closen geprüft wird,

Dein erster Tipp mit dispose on close hat funktioniert.
ich habe das Programm gerade noch mal überprüft. Dabei habe ich folgende interne Klasse gefunden und deinen Tipp angewandt.
Die andere Methode war tatsächlich unnütz. Ich hatte sie auf einer anderen Seite gefunden.

Danke :slight_smile:

{
	private static final long serialVersionUID = 1L;
	JLabel anzeige;
	public Fenster() 
	{
		setSize(300, 300);
		setLocation(400, 300);
		add(anzeige=new JLabel("neues Fenster"));
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setVisible(true);
	}
}

Lies dir mal bitte das hier durch:

http://wiki.byte-welt.net/wiki/Warum_man_nicht_von_JFrame/JDialog_erben_sollte