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:
 

Schandro

Top Contributor
(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:

hdi

Top Contributor
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.
 

Schandro

Top Contributor
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:

hdi

Top Contributor
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
 

Marco13

Top Contributor
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.
 

Schandro

Top Contributor
Stimmt, hab ich vergessen. War zu fokusiert auf die Aussage das andere Threads weiterlaufen. danke
 

hdi

Top Contributor
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.
Ähnliche Java Themen
  Titel Forum Antworten Datum
U Code doch nicht austauschbar in 2DGraphics AWT, Swing, JavaFX & SWT 2
S GUI Entwicklung: GUI Builder oder doch lieber händisch? AWT, Swing, JavaFX & SWT 17
N JComponenten in JList oder doch anders? AWT, Swing, JavaFX & SWT 0
J Gibt es brauchbare GUI-Builder, oder doch besser alles per Hand machen? AWT, Swing, JavaFX & SWT 6
T 3D-Grafik Nifty oder doch Swing ?! AWT, Swing, JavaFX & SWT 4
N Swing JFrame==null und doch nicht null?! AWT, Swing, JavaFX & SWT 4
C Button Klasse mit allem drum und dran leider fehlt doch was ^^ AWT, Swing, JavaFX & SWT 6
G komplexes JOptionPane (oder doch JFrame?) AWT, Swing, JavaFX & SWT 2
Y Spielfeld mit paintComponent oder doch lieber anders? AWT, Swing, JavaFX & SWT 8
B Kleines JFrame Problem (oder doch größer?) AWT, Swing, JavaFX & SWT 2
I Anderes (schlechteres) Font-Rendering in OpenJDK 8 AWT, Swing, JavaFX & SWT 21
G FX warten bis ein anderes GUI Element ausgewählt wurde AWT, Swing, JavaFX & SWT 8
H Beim JFrame erstellen ein anderes schließen AWT, Swing, JavaFX & SWT 0
A Methode pausieren bis anderes Ereignis ausgeführt AWT, Swing, JavaFX & SWT 2
P Variable einer Eingabe in anderes Textfeld schreiben AWT, Swing, JavaFX & SWT 7
L JavaFX CSS in ein anderes CSS importieren AWT, Swing, JavaFX & SWT 2
Thallius Wer oder was bestimmt welches Frame toFront kommt wenn ein anderes geschlossen wird? AWT, Swing, JavaFX & SWT 8
Ghostman1711 GUI Java von Klasse mit Application Windows anderes Application Window aufrufen AWT, Swing, JavaFX & SWT 6
B Swing WindowBuilde: Menu -> anderes Panel wechseln AWT, Swing, JavaFX & SWT 1
D Von JPanel auf anderes JPanel zugreifen AWT, Swing, JavaFX & SWT 9
L Image in anderes kopieren AWT, Swing, JavaFX & SWT 0
D 2D-Grafik Inhalt eines Graphics in anderes Graphics zeichnen.... AWT, Swing, JavaFX & SWT 3
O Swing-MVC: JFrame verstecken und anderes anzeigen AWT, Swing, JavaFX & SWT 10
J 2D-Grafik Bildteile in ein anderes Bild speichern AWT, Swing, JavaFX & SWT 12
J Fenster schließt anderes Fenster AWT, Swing, JavaFX & SWT 4
C AWT Fokus von Component entfernen, wenn kein anderes vorhanden AWT, Swing, JavaFX & SWT 4
E Fenster schließen und ein anderes öffnen AWT, Swing, JavaFX & SWT 9
Luk10 BufferedImage auf ein anderes BufferedImage zeichnen AWT, Swing, JavaFX & SWT 6
T Swing JFrame blockieren während anderes JFrame offen ist AWT, Swing, JavaFX & SWT 2
J 2D-Grafik Graphics2D object in ein anderes Zeichnen AWT, Swing, JavaFX & SWT 7
P Swing Wie bekomme ich eine Referenz auf ein Objekt das im EDT erzeugt wird? Und anderes... AWT, Swing, JavaFX & SWT 8
R Swing Auf ein anderes jFrame zugreifen? AWT, Swing, JavaFX & SWT 5
Semox Swing JFrame extern erzeugen und in anderes JFrame einbetten AWT, Swing, JavaFX & SWT 7
S Swing: Look and Feel abändern oder für Teilkomponenten anderes LaF setzen AWT, Swing, JavaFX & SWT 2
H anderes font in textarea AWT, Swing, JavaFX & SWT 2
U Frame öffnet anderes Frame: Methode auslagern AWT, Swing, JavaFX & SWT 26
H Nulllayout in ein anderes Layout AWT, Swing, JavaFX & SWT 5
G JTable oder anderes? AWT, Swing, JavaFX & SWT 6
J Im JLabel Bild durch anderes ersetzen, ohne dass es 'blinkt' AWT, Swing, JavaFX & SWT 12
S Vorhandene Datei in anderes Verzeichnis schreiben! AWT, Swing, JavaFX & SWT 8
S Wie anzeigen? Jtree oder was anderes? AWT, Swing, JavaFX & SWT 3
C ApplicationWindow Shell minimieren (Anderes Event ausführen) AWT, Swing, JavaFX & SWT 4
D Widget/Control während Laufzeit durch ein anderes ersetzen AWT, Swing, JavaFX & SWT 3
F Datenübergabe von einem JFrame auf ein anderes AWT, Swing, JavaFX & SWT 2
G Listbox, combobox oder was anderes? [swing] AWT, Swing, JavaFX & SWT 4
M Panel durch ein anderes Panel ersetzen AWT, Swing, JavaFX & SWT 4
W Anderes Look And Feel AWT, Swing, JavaFX & SWT 9
S AWT: Panel durch anderes Panel ersetzen. Neuzeichnen-Problem AWT, Swing, JavaFX & SWT 4
S Anderes Look'n'Feel = JTextArea doppelt so gross! AWT, Swing, JavaFX & SWT 13
F DRINGEND! Bild in ein anderes Bild einbinden. AWT, Swing, JavaFX & SWT 9
T Anderes Panel nach Button-Klick laden AWT, Swing, JavaFX & SWT 9

Ähnliche Java Themen

Neue Themen


Oben