Swing JFrame schließt sich nicht

Kakulukiam21

Aktives Mitglied
Hallo Na,

ich habe hier folgendes Problem:

Ich habe hier meine JFrames die alle an sich funktionieren und auch keine Fehler oder so werfen.
Nur habe ich (mehr durch Zufall) rausbekommen das sich die Fenster nicht richtig schließen unter bestimmten Bedingung.

Diese Bedingungen wären, innerhalb von einer Sekunden 3 mal auf den Button zu klicken, ergo wie behämmert auf die Maus hauen.

Die JFrames sollten sich eigentlich mit jedem Klick schließen und ein neues erstellen.
Um sie zu schließen benutze ich
Java:
this.setVisible(false);
this.dispose();

Gibs dafür eine nette Lösung?

Ich hätte die Idee das ich im Hintergrund ein Timer laufen lasse, da sich die Frames im Hintergrund nicht verändern und ich sie dann schließe. Falls es wieder soweit kommt
 
Hast du setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); gesetzt? Beendet im falschen Thread?
Mach mal ein KSBK
 
Zuletzt bearbeitet von einem Moderator:
Hast du setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); gesetzt? Beendet im falschen Thread?
Mach mal ein KSBK

Ich hatte kein setDefaultCloseOperation gesetzt, hat aber auch kein Unterschied gemacht als ich es reingenommen habe.

Das er es im falschen Thread beendet kann gut sein, weiß ich aber nicht. Denke eher nicht

Was ist ein KSBK?
 
hast du mein beitrag überhaupt gelesen^^????
Ich hab gesagt KURZ, also jeden Mist den man für das Problem nicht braucht raus, sowie z.B. deine Bilder, Schrifte usw.
2tens KOMILIERBAR, ich hab keine Klasse Countdown wie soll ich also dein Code ausführen???
3tens sehe ich nirgenswo ein dispose? Kristallkugel?

EDIT: Warum ist dein Button nicht fokusierbar? Warum erstellst du neue Klassen und lässt die Anzeigen wenn du dein Frame eh schließen willst???

EDIT EDIT : Gut dass mein Beitrag jetzt noch viel Sinn macht 😛
 
Zuletzt bearbeitet von einem Moderator:
So ich hoffe ich habe ihn jetzt so kurz wie möglich gehalten 😛

Klasse Overview
Java:
import java.awt.Dimension;

import java.awt.Toolkit;
import javax.swing.*;

import uta.Buttons;

public class Overview {
	Tools hilfe = new Tools();
	Buttons create = new Buttons();
	JLabel design;

	public void anzeige() {
		final JFrame gui = new JFrame();
		gui.setUndecorated(true);
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		gui.setSize(screenSize);
		gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		gui.setLayout(null);
		design = new JLabel(bild);

		hilfe.displayMenu(gui, getClass().toString());

		gui.setVisible(true);

	}
}


Klasse displayMenu
Java:
import java.awt.*;
import javax.swing.*;
import uta.Buttons;

public class Tools {
	Buttons create = new Buttons();

	
	public void displayMenu(JFrame gui, String className) {

		gui.getLayeredPane().add(create.Name1(gui, className),
				new Integer(JLayeredPane.DEFAULT_LAYER.intValue() + 1));
	} 

}


Klasse Buttons
Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;

public class Buttons {
	public int button = 62;
	public Color background = Color.GRAY;
	public int menu1 = 20;
	public int menu2 = 684;
	private JButton button;

	public JButton Name1(final JFrame gui, String className) {

		button = new JButton(kalbIcon);
		button.setBounds(menu1, 105, button, button);
		button.setFocusable(false);
		if (className.contains("Einfach") || className.contains("Sinnloser")
				|| className.contains("Text")) {
			button.setBackground(Color.GRAY);
		} else {
			button.setBackground(Color.WHITE);
		}

		button.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {
				// TODO Auto-generated method stub
				Overview kalb = new Overview();
				// System.out.println("-------Klick Stop");
				kalb.anzeige();
				gui.setVisible(false);
				gui.dispose();
				
			}
		});
		return button;
	}
}

Schönheitsfehler könnt ihr behalten 😉

Um die Frage zu beantworten, nicht fokusierbar weil es sonst einfach hässlich aussieht 😀
 
Zuletzt bearbeitet:
Das ist doch nicht kurz... und kompilierbar erst recht nicht...
du kannst dein problem in 2 klassen beschreiben
 
Das ist kurz knapp und kombilierbar

Java:
public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			
			@Override
			public void run() {
				MyFrame frame = new MyFrame();
				frame.pack();
				frame.setVisible(true);
			}
		});

	}

}

Java:
public class MyFrame extends JFrame{

	public MyFrame(){
		super("Test");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		add(new MyPanel(this));
	}
	
}

Java:
public class MyPanel extends JPanel{
	
	public MyPanel(final JFrame parent){
		JButton button = new JButton("Beenden");
		button.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				parent.dispose();
				
			}
		});
		add(button);
	}

}
 
Java:
 button.addActionListener(new ActionListener() {
 
            @Override
            public void actionPerformed(ActionEvent arg0) {
                                Overview kalb = new Overview();
                              
            }
        });

Hier erstellst du jedes mal ein neues JFrame und machst es wieder auf, wie soll es dann auch zugehen ???:L
 
Hier erstellst du jedes mal ein neues JFrame und machst es wieder auf, wie soll es dann auch zugehen

An der Stelle ist es verwirrend, stimmt. Wenn ich bei Overview bin und zu Overview wieder gehe schließe ich das Fenster und bau es direkt noch mal auf.

Nur weiß ich nicht wie ich das umgehen könnte damit das nicht passiert.
 
Hast du das GUI mit Window Builder erstellt? Sieht zumindest sehr danach aus. Für den Anfang würde ich dass nicht machen sondern erstmal verstehen wie das ganze ohne funktioniert. Eventuell treten dann solche Probleme erst garnicht auf. (sollte ich mich irren .. sry)
 
An der Stelle ist es verwirrend, stimmt. Wenn ich bei Overview bin und zu Overview wieder gehe schließe ich das Fenster und bau es direkt noch mal auf.

Nur weiß ich nicht wie ich das umgehen könnte damit das nicht passiert.

Ja was soll das für einen Sinn machen?? Das ist eine endlosschleife und es fehlt immer noch das CloseOperation im JFrame...

Normalwerweise lässt man das JFrame offen bis der Anwender das Programm beendet und tauscht nur JPanels aus. Dein Aufbau der ganzen Anwendungen ist sehr verwirrend... Darum bau dir ein KSKB dann findest den Fehler beim rauschmeißen deiner Komponenten alleine
 
Normalwerweise lässt man das JFrame offen bis der Anwender das Programm beendet und tauscht nur JPanels aus.

Hm wie meinst du das?
Ich habe ja unterschiedliche Hintergrundbilder etc. die angezeigt werden müssen.


Meinst du damit das ich die ganzen Sachen dann einfach auf ein JPanel lege und dieses dann nur austausche?
 
Danke, ich werde mir das mit dem Tabbed Pane mal genauer anschauen. Da ist in etwa die Richtung was ich mir schon mal überlegt hatte aber keine Umsetzung wusste und es einfach gehalten habe.
 
Vor allem würde ich mal deinen Programmierstil überdenken. Du ziehst das ganze ziemlich Funktionsorientiert auf. Java ist Objektorientiert. Es ist auch viel übersichtlicher, wenn du dir in einer Klasse eine GUI zusammenbaust, anstatt das Erstellen einzelner Komponenten in "Tool","Buttons" oder "create" Klassen auszulagern. Wenn du einen besonderen Button hast, der wiederverwendbar sein soll, mach eine Klasse "MeinBesondererButton". Ein new MeinBesondererButton() ist sehr viel aussagekräftiger als create.Name1(....................);
 

Zurück
Oben