GUI per Boolean steuern

Jesfreric

Aktives Mitglied
Liebes Forum

Ich bin gerade dabei mein erstes Programm zu schreiben und wollte mal fragen ob nicht die Möglichkeit besteht die Sichtbarkeit diverser JFrames über Boolean zu steuern.
Ich habe ein Haupt JFrame (codiert in der main-Methode) das zwei Buttons besitzt. Wenn ich darauf klicke öffnet sich ein neues JFrame. Ich möchte das erste nun aber gerne ausgeblendet haben. Leider kann ich der ActionPerformed Methode ja nicht sagen: „HauptJFrame.setVisible( false )“, weil hier gesagt wird, dass es das HauptJFrame nicht finden kann.
Hatte schon versucht eine public Variable zu erstellen unter deren Kontrolle die Sichtbarkeit des HauptJFrames steht. Leider hängt sich da allerdings mein Programm auf…

Java:
//Java-Code
.
.
.
public Boolean VisControl = new Boolean( true );
.
.
.
.

while(VisControl == true){
    HauptJFrame.setVisible( true );
}
.
.
.
.

//ActionPerformed
VisControl = false;

Wie kann ich dieses Problem lösen?
 
Das sich das Programm aufhängt ist klar, da du eine Endlosschleife im GUI Thread gemacht hast. 😉

Du machst eine Klasse, die alle JFrames kennt und eine Methode setVisible(int, boolean) bereitstellt. Die Klasse speichert die JFrames in einer List oder in einem Array. Der int Wert ist der Index oder der Index + 1. Der boolean ist die Visibility.
 
Ich bin gerade dabei mein erstes Programm zu schreiben ....

Dein aller erstes Programm oder dein 1.Programm mit GUI? Wenn es das aller erste ist solltest du dich vielleicht noch auf Konsolenprogramme beschränken 🙂

.... und wollte mal fragen ob nicht die Möglichkeit besteht die Sichtbarkeit diverser JFrames über Boolean zu steuern.

Wird ja sowieso gemacht per
Code:
setVisible(true/false);
. Hier gibst du einfach an ob das JFrame sichtbar sein soll oder nicht.

Ich habe ein Haupt JFrame (codiert in der main-Methode) das zwei Buttons besitzt. Wenn ich darauf klicke öffnet sich ein neues JFrame. Ich möchte das erste nun aber gerne ausgeblendet haben. Leider kann ich der ActionPerformed Methode ja nicht sagen: „HauptJFrame.setVisible( false )“, weil hier gesagt wird, dass es das HauptJFrame nicht finden kann.
Hatte schon versucht eine public Variable zu erstellen unter deren Kontrolle die Sichtbarkeit des HauptJFrames steht. Leider hängt sich da allerdings mein Programm auf…

Java:
while(VisControl == true){
    HauptJFrame.setVisible( true );
}
Wie kann ich dieses Problem lösen?

Das Problem warum dein Programm einfriert liegt daran das die while-Schleife auf dem GUI Thread ausgeführt und somit deine GUI blockiert. Theoretisch müsstest du diese Schleife in einen eigenen Thread auslagern. Aber generell macht diese Schleife keinen Sinn, da es nichts bringt "endlos"
Code:
setVisible(false)
aufzurufen => 1x reicht vollkommen.

Im ActionListener vom Button solltest du das Hauptfenster auf unsichtbar setzen und das neue Fenster auf sichtbar. Sobald das neue geschlossen wird solltest du dieses Fenster schließen und das Hauptfenster wieder auf sichtbar, dazu brauchst du eine Referenz auf dieses Hauptfenster.
 
Wenn du Fenster ( JFrames ) ausblenden möchtest dann baue diese ab und zwar über

Java:
frame.dispose();

wenn du es nur über

Java:
frame.setVisible(false);

usichtbar machst , bleibt es Trotzdem aktiv und auch auf dem Heap, nur das du dieses Fenster eben nichtmehr siehtst!

Zudem solltest du schon wie beschrieben keine Aufwendigeren Logik Bestandteile im EDT ausführen!

Ich möchte das erste nun aber gerne ausgeblendet haben.
Warum ^^?

Das ist möglich aber ich verstehe den Sinn dahinter noch nicht so ganz 🙂.

Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Foo extends JFrame implements ActionListener{
    private static final long serialVersionUID = 1L;
	
	JFrame frame;
    
	public Foo() {

		JButton btn = new JButton("Neues Fenster");
		btn.addActionListener(this);
		
		this.add(btn);
		
		this.setSize(250,150);
		this.setLocationRelativeTo(null);
		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	   
    }

	@Override
    public void actionPerformed(ActionEvent e) {
	    this.frame = new JFrame();
	    frame.setSize(250,150);
	    frame.setVisible(true);
	    frame.setLocationRelativeTo(null);
	    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	    
	    frame.add(new JLabel("Wuhu, ich bin ein neues Fenster!"));
	    
	    this.dispose(); // <<--
    }
	
	public static void main(String[] args) {
	    new Foo().setVisible(true);
    }
}
 
Zuletzt bearbeitet:

Zurück
Oben