Nicht-Modales Fenster von einem Modalen JDialog aus aufrufen

xanadoo

Erfahrenes Mitglied
Hallo zusammen

Ich möchte von einem Modalen JDialog aus ein Help-System aufrufen.
Dies muss aber Nicht-Modalen angezeit werden, und sollte natürlch auch bedienbar sein ohne das ich den Modalen Dialog vorher schliesse.

Wie bringe ich denn über eine Modale, eine Nicht-Modale Swing Componente?
So direkt geht das ja nicht.
Jedoch denke ich, dass es eine Lösung geben muss, denn z.B. JavaHelp lässt sich ja auch von einem Modalen Dialog aus aufrufen.


Besten Dank für jede Hilfe.
 
wenn du dein Help-System auch als JDialog aufziehst und als Owner den modalen Dialog mitgibst sollte es eigentlich funktionieren.
Denn ein modaler Dialog sollte eigentlich nur alle übergeordneten Fenster sperren nicht aber untergeordnete.
 
Leider handelt es sich beim HelpSystem um ein JFrame, welches ich, wenn irgendwie möglich, so übernemen möchte.

Ich habe es nun mal zu Testzwecken mit zwei JDialogen versucht.
Jedoch lässt sich der vom modalen Dialog aufgerufene nicht moddale Dialog mit der Maus nicht bedienen, sondern nur in den Vordergund holen.
(Mit der Tastatur liese er sich zwar bedienen, jedoch ist dies natürlich nicht befriedigend).
 
hm laut doku sollte es aber eigentlich gehen:
Java:
JDialog modalDialog = new JDialog(...);
...
modalDialog.setModalityType(ModalityType.APPLICATION_MODAL);
...
siehe:
http://download.oracle.com/javase/6...setModalityType(java.awt.Dialog.ModalityType)
http://download.oracle.com/javase/6/docs/api/java/awt/Dialog.ModalityType.html#APPLICATION_MODAL

Zu beachten ist jedoch dass der JFrame von der Dialog-Klasse aus aufgerufen werden muss da er nur so als Kind-Element gezählt wird.
Beim JDialog könnte man dies durch die Angabe im Konstruktor ganz einfach umgehen.
Berichtigt mich bitte einer wenn ich falsch liege
 
Hallo und Danke für deine Tipps.

Ich habe das mit den Dialogen nun doch auch hin bekommen. Keine Ahnung, wieso es vorher nicht geklappt hat.
Jedoch schaffe ich es im Moment nicht mit einem Frame...

Hier mal ein einfaches Beispiel von einem Modalen Dialog, welcher über einen Button ein Frame aufruft, das Frame wiederum ruftüber einen Button eine einfache JOptionPane auf, um zu sehen ob das Frame richtig bedienbar ist:

Code:
import java.awt.event.*;
import javax.swing.*;

public class Test {

	public static void main(String[] args) {
		new Modal().show();
	}
	
}

/**
 * Der Modale Dialog
 */
class Modal extends JDialog implements ActionListener {

	JButton jButton = null;

	public Modal() {
		super();
		initialize();
	}

	private void initialize() {
		this.setTitle("Modal");
		this.setContentPane(getButton());
		this.setModal(true);
		this.pack();
	}

	private JButton getButton() {
		if (jButton == null) {
			jButton = new JButton("Open NonModal Frame");
			jButton.addActionListener(this);
		}

		return jButton;
	}

	public void actionPerformed(ActionEvent e) {
		JFrame nonModal = new NonModal();
		nonModal.show();
	}
}

/**
 * Das Non-Modal Frame
 */
class NonModal extends JFrame implements ActionListener {

	JButton jButton = null;

	public NonModal() {
		super();
		initialize();
	}

	private void initialize() {
		this.setTitle("Non-Modal");
		this.setContentPane(getButton());
		this.pack();
	}

	private JButton getButton() {
		if (jButton == null) {
			jButton = new JButton("Dummy");
			jButton.addActionListener(this);
		}

		return jButton;
	}

	public void actionPerformed(ActionEvent e) {
		JOptionPane.showMessageDialog(this, "Ping");
	}

}

Aber das Frame ist gesperrt, bis ich den Dialog geschlossen habe. Ich glaub ich steh auf dem Schlauch...
Das war doch so wie du gemeint hast oder? Einem Frame kann ich ja keinen Parent mitgeben, oder sehe ich das falsch?

Ich muss noch sagen, dass ich mit Java 5 arbeiten muss, da gibts ModalityType noch nicht, aber ich hoffe mal, dass es am Schluss nicht daran scheitern wird.

Hat jemand einen Tipp?
 
Ok hab mich doch mal hingesetzt und hab mal ein bisschen ausprobiert. Ich hab nun auch eine Lösung gefunden.

Um die vom Dialog aufgerufenen Frames benutzen zu können benötigt man folgende Einstellung im Dialog:
Java:
this.setModalityType(ModalityType.DOCUMENT_MODAL);
Dadurch wird zum einen der Frame geblockt der den Dialog aufruft, aber die Frames die vom Dialog aufgerufen werden, können benutzt werden.

Hier aber noch 2 kleine Tipps für dich:
Java:
...
this.setVisible(true) /* this.show() ist deprecated und sollte nicht mehr verwendet werden */
this.setLocationRelativeTo(null) /* zentriert die Anwendung auf dem Schirm */
/* für Dialoge bietet sich statt null auch eine Refernz auf das aufrufende Frame an */
...
 
Hallo

Besten Dank für dein Tipp, aber
Code:
this.setModalityType(ModalityType.DOCUMENT_MODAL);
gibt es erst ab Java 6 dachte ich?
 
Ups hab das mit dem Java 5 irgendwie verdrängt
Wenn ich ne Lösung finde melde ich mich noch einmal, aber ich glaube es schaut schlecht aus, weil das setModal() wirklich alle anderen Fenster sperrt
 
Zuletzt bearbeitet:
Ja, da das Ding am Schluss auch auf Mac OS 10.4 laufen muss hänge ich auf Java 5 fest :-(
Ich befürchte inzwischen auch, dass ich das JFrame nun doch in einen JDialog umbuen muss.

Trozdem danke für deine Tipps.
 
Zurück