Swing setComponentZOrder() oder doch was anderes?

Status
Nicht offen für weitere Antworten.

hdi

Top Contributor
Hey Leute,

ich habe ein JFrame (hauptfenster), und lasse nun in Relation dazu einen JDialog aufpoppen:

Java:
dialog.setLocationRelativeTo(hauptfenster)

Der Dialog ist Undecorated, weil der Nutzer ihn auch nicht schließen können soll. Er dient dazu den Nutzer darauf hinzuweisen dass er warten soll. (Das Hauptfenster ist während dieser Zeit auch deaktiviert).

Nun habe ich folgendes Problem:

Klickt der User während der Wartezeit auf dem Desktop rum, und öffnet dann wieder das Hauptfenster, sieht man den Dialog nicht mehr. Er liegt wohl dahinter. Durch die Taskleiste lässt er sich natürlich nicht holen weil er undecorated ist.

Ich könnte jetzt ein alwaysOnTop auf den Dialog machen, was ich aber nicht möchte.

Was ich bräuchte wäre eher ein:

Java:
// Pseudo-Code
dialog.setAlwaysOnTopOfHauptfenster();

Durch die API bin ich auf die Methode setComponentZOrder(Component, int) gekommen.
Ich dachte mir, dass es ja das sein müsste, was ich suche.

Aber ich bekomme immer Exceptions, die verschiedensten je nachdem was ich versuche. zB bei dem hier:

Java:
dialog.setComponentZOrder(hauptfenster,0)

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: adding a window to a container

Entweder ich verstehe die Beschreibung falsch, oder diese Methode macht doch nicht was ich will.

Wie kann ich das realisieren?

Vielen Dank :toll:
 
(Das Hauptfenster ist während dieser Zeit auch deaktiviert).
Dann mach doch einfach den JDialog modal.

Beispielcode
Java:
import java.awt.Color;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class JFrameWithJDialog {
	public static void main(String[] args) {
		new JFrameWithJDialog();
	}
	
	public JFrameWithJDialog(){
		final JFrame window = new JFrame();
		window.getContentPane().setBackground(Color.WHITE);
		window.setBounds(100,100,500,300);
		
		window.addKeyListener(new KeyAdapter(){ // steht für irgendein Event was der Benutzer auslöst
			@Override
			public void keyPressed(KeyEvent event){
				JDialog dialog = new JDialog(window,true);
				dialog.setSize(100,50);
				dialog.setUndecorated(true);
				dialog.setLocationRelativeTo(window);
				dialog.add(new JLabel("   JDialog"));
				dialog.setVisible(true);
			}
		});
		
		window.setVisible(true);
	}
}

Durch die Taskleiste lässt er sich natürlich nicht holen weil er undecorated ist.
Dialoge haben nie einen Eintrag in der Taskleiste.
 
Zuletzt bearbeitet:
Naja aber modal heisst doch dass das Programm hängen bleibt bis der Dialog geschlossen ist, oder? Es wird ja etwas geladen im Hintergrund, der User soll halt nur warten, aber nicht das Programm soll warten.
 
Wenn ein modaler Dialog geöffnet wird kann der Benutzer die anderen Fenster nicht mehr benutzen/fokusieren. Alles andere läuft normal weiter. €dit: Außer der Thread der den Dialog sichtbar gemacht hat...
 
Zuletzt bearbeitet:
Okay danke, nur ein kleines Problem jetzt noch:

Der Dialog ist ein Singleton, den ich mir einfach über die Klasse mittels getInstance() holen möchte. Dann rufe ich eine Methode auf, die so aussieht:

Java:
public void layOn(Component source) {
		setLocationRelativeTo(source);
		setVisible(true);
	}

D.h. also aus dem Hauptfenster mit this. Jetzt verhält sich das aber nicht so, wie wenn man das Frame im Konstruktor übergibt. Denn wenn man das Fenster wegklickt und dann wieder anzeigen will, ist diesmal zwar der Dialog sichtbar, aber das Fenster selbst erscheint nicht!

Sprich was macht da der Konstruktor noch mit dem JFrame, das ich jetzt im Nachhinein in dieser Methode aufrufen muss, damit auch das Fenster immer mit angezeigt wird?

Wie gesagt bei der Erstellung des Dialogs kenn ich den owner noch nicht, und außerdem sollte er für verschiedene Frames anwendbar sein.

danke
 
Wenn ein modaler Dialog geöffnet wird kann der Benutzer die anderen Fenster nicht mehr benutzen/fokusieren. Alles andere läuft normal weiter.
Wenn mich nicht alles täuscht, stimmt das so nicht. Ein modaler Dialog blockiert den aufrufenden Thread. (Und bevor der Einwand kommt: Es wird dann quasi ein neuer EDT erstellt).

Andernfalls würden solche Standarddialoge wie
Code:
int returnValue = JOptionPane.showSomeDialog();
if (returnValue == APPROVE_OPTION) {...}
ja nicht funktionieren.
 
Ja also wie dieses "es wird ein neuer EDT erstellt" genau funzt wär auch mal interessant. Egal, b2t: Ich hab jetzt durch die Java-Klassen gewühlt aber ich kann das nicht reproduzieren was da passiert. Also übergeb ich das Frame jetzt halt doch schon im Konstruktor.

D.h. alles läuft, Problem erledigt, dankeschön
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben