Ende eines Dialoges abwarten

Andi_CH

Top Contributor
Mir scheinen die richtigen Begriffe für google zu fehlen...
ConfigPanel enthält einen PanelBuilder.

Ich möchte, dass der aufrufende Thread blockiert wird und "done" erst nach dem Verlassen des Config-Dialoges ausgegeben wird.

Wie mache ich das?

Meine Startroutine (na ja, recht banal 🙂 )

Java:
private void showConfig() {
	frame = new JFrame();
	ConfigPanel cp = new ConfigPanel(mCfg);
	frame.add(cp.getPanel());
	frame.setLocation(100, 100);
	frame.setSize(300, 200);
	frame.pack();
	frame.setVisible(true);
	System.out.println("done");
}
 
Zuletzt bearbeitet:
Wo wird denn da überhaupt "done" ausgegeben? 😛

Wenn du das ganze im EDT machst passiert das automatisch. Wenn nicht könntest du in den EDT wechseln und im aufrufenden Thread mit wait/interrupt arbeiten.
 
Wo wird denn da überhaupt "done" ausgegeben? 😛

Wird es doch 😀

Ich habe den Code zusammengestrippt und eine Zeile zuviel gelöscht ;-)
Natürlich gebe ich dort nicht "done" aus, sondern werte die neuen Einstellungen aus.

Eike: Sourcen Reeingineeren? Ist das state of the art? Anyway ich schau mal rein.

Das Beispiel verhält sich noch dümmer - wenn eines der Fenster geschlossen wird, terminiert die Applikation

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

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

@SuppressWarnings("serial")
public class MenuExp extends JFrame {
	
	private static int x = 100;
	private static int y = 100;
	
	public MenuExp() {
		setTitle("Menu Example");
		setSize(150, 150);
		setLocation(x, y);
		x += 50;
		y += 50;
		JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);
		JMenu fileMenu = new JMenu("File");
		menuBar.add(fileMenu);
		JMenuItem newAction = new JMenuItem("New");
		fileMenu.add(newAction);
		newAction.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				System.out.println("You have clicked on the new action");
				MenuExp me = new MenuExp();
				me.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				me.setVisible(true);
				System.out.println("done");
			}
		});
	}
	public static void main(String[] args) {
		MenuExp me = new MenuExp();
		me.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		me.setVisible(true);
	}
}
 
Nein, das stimmt so nicht DanZ. Wenn du nen JDialog verwendest und dort setVisible(true); aufrufst läuft dein Programm trotzdem weiter.
 
Nein, das stimmt so nicht DanZ. Wenn du nen JDialog verwendest und dort setVisible(true); aufrufst läuft dein Programm trotzdem weiter.

Sicher? Also zumindest bei Dialog sagt mir die JavaDoc

Code:
 If the dialog is not already
     * visible, this call will not return until the dialog is
     * hidden...

Und JOptionPane benutzt auch nichts anderes... Und da im JDialog nichts dazu steht war ich davon ausgegangen, dass das da genauso ist.
 
Oh Tatsache, du hast Recht. Ich war der Meinung dass JOptionPane da noch etwas mehr Magie reinsteckt.
Dann is das ja recht easy 🙂
 
JDialog
Java:
public static void main(String[] args)
	{
		EventQueue.invokeLater(new Runnable()
			{
				public void run()
				{
					try
					{
						JFrame frame = new JFrame();
						frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
						frame.setBounds(100, 100, 450, 300);
						frame.setVisible(true);
						JDialog modalerDialog=new JDialog(frame,true);
						modalerDialog.setBounds(200,200,100,100);
						modalerDialog.setVisible(true);
						System.out.println("Done");
					} catch (Exception e)
					{
						e.printStackTrace();
					}
				}
			});
	}
 
modal - ich hab den Nebeneffekt nicht erwartet, aber es ist die Lösung.
Wenn der Dialog nicht modal ist, läuft der Aufrufende weiter (muss er eigentlich auch)
Danke euch allen
 
[TIPP]Modal sollte ein Dialog aber nur sein, wenn es unbedingt nötig ist. Nicht, weil das bequemer zu programmieren ist.[/TIPP]
 
[TIPP]Modal sollte ein Dialog aber nur sein, wenn es unbedingt nötig ist. Nicht, weil das bequemer zu programmieren ist.[/TIPP]

Wo du das grad ansprichst, was ist nach deiner Meinung denn "unbedingt nötig"? Die "Thread schlafen lassen" Funktionalität selber zu schreiben dürfte ja problematischer sein...
 
Wo du das grad ansprichst, was ist nach deiner Meinung denn "unbedingt nötig"?
Wenn die Aufmerksamkeit des Anwenders auf den Dialog konzentriert werden muss und sich ein "normales" Weiterarbeiten verbietet. (Mode (computer interface) - Wikipedia, the free encyclopedia)

Ist es z.B. ein Config-Dialog, wo jetzt wichtige Einstellungen vorgenommen werden müssen -> dann modal.
Oder werden nur Config-Daten für irgend ein x-beliebiges Item angezeigt. Vielleicht möchte man mehr Dialoge gleichzeitig öffnen, um die Configdaten verschiedener Items zu vergleichen -> dann nicht modal.

Die "Thread schlafen lassen" Funktionalität selber zu schreiben dürfte ja problematischer sein...
Dann will man natürlich auch diese "Funktionalität" nicht haben.
 
Ist es z.B. ein Config-Dialog, wo jetzt wichtige Einstellungen vorgenommen werden müssen -> dann modal.
Oder werden nur Config-Daten für irgend ein x-beliebiges Item angezeigt. Vielleicht möchte man mehr Dialoge gleichzeitig öffnen, um die Configdaten verschiedener Items zu vergleichen -> dann nicht modal.

Wie der Name vermuten lässt, werden Konfigurationsdaten eingegeben und im konkreten Fall sind es die für DAS Programm, nicht für ein Item - bis die Eingaben fertig sind und übernommen werden könnte theoretisch weitergearbeitet werden, aber bis jetzt arbeite ich mit den Originaldaten. (Ich könnte auch eine Kopie machen - kein Problem)

Ich als User mag modale Dialoge auch nicht besonders, aber in diesem Fall ist es wohl angebracht.

Was gibt es für Alternativen?

Unabhägig laufender Dialog.
Ende melden per Listener?
Im laufenden Hauptprgramm die Konfiguration austauschen? -> ist wohl kein banales Problem

Villeicht kommt ja noch eine alternative Idee für die "Nachwelt" bzw. die Forums-suchenden
 
Du kannst den modalityType auf Document_Modal setzen:
Java:
import java.awt.BorderLayout;
import java.awt.Dialog.ModalityType;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;


public class ModalerDialogKSKB
{
	public static void main(String[] args)
	{
		EventQueue.invokeLater(new Runnable()
			{
				public void run()
				{
					try
					{
						JFrame frame = new JFrame();
						frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
						frame.setBounds(100, 100, 450, 300);
						JButton countButton=new JButton("0");
						countButton.addActionListener(new ActionListener()
						{
							int count=0;
							@Override
							public void actionPerformed(ActionEvent e)
							{
								count++;
								((JButton)e.getSource()).setText(String.valueOf(count));
							}
						});
						frame.add(countButton,BorderLayout.SOUTH);
											
						frame.setVisible(true);
						JDialog modalerDialog=new JDialog();
						modalerDialog.setModalityType(ModalityType.DOCUMENT_MODAL);
						modalerDialog.setBounds(200,200,100,100);
						modalerDialog.setVisible(true);
						System.out.println("Done");
					} catch (Exception e)
					{
						e.printStackTrace();
					}
				}
			});
	}
}
 

Neue Themen


Zurück
Oben