Eigens programmierter Dialog

Hi.

Ich brauche einen Dialog in Richtung der JOptionPane-Klasse. Sprich, einen Dialog, der solange das Programm blockiert, bis bspw. die Buttons Abbrechen oder Bestätigen gedrückt wird. Ein JOptionPane reicht allerdings nicht(Beim schreiben kommt mir allerdings schon die Idee, tatsächlich ein eigenen JOptionPane zu machen, aber das löst das Problem ja auch nicht.)
Die Oberfläche dafür ist nicht das Problem, sondern viel mehr das blockieren (daher hab ich auch bei Allgemein und nicht bei GUI gepostet) und dabei komme ich nicht weiter.

Mein Dialog ist ein normaler JFrame erweitert um folgende Funktionen:

    	this.ids = ids;
    	Iterator<String> iterator = ids.iterator();
    	while (iterator.hasNext()) {		
    		((DefaultListModel)lPrograms.getModel()).addElement(iterator.next());
    	}
    	try {
			synchronized (this) {
				this.wait();
			}
			gui.choiceAccepted();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
    
    void accept() {
    	System.out.println("Accept");
    	synchronized (this) {
    		this.notifyAll();
    	}
    }
    
    void remove() {
    	System.out.println("Remove");
    	String removeElement = (String)lPrograms.getSelectedValue();
    	ids.remove(removeElement);
    	((DefaultListModel)lPrograms.getModel()).removeElement(removeElement);
    }
    
    void abort() {
    	System.out.println("Abort");
    	ids.clear();
    	((DefaultListModel)lPrograms.getModel()).removeAllElements();
    	synchronized (this) {
    		this.notifyAll();
    	}
    }```

abort, remove und accept sind Funktionen, die vom ActionListener meiner Buttons aufgerufen werden. Bei abort und accept wird this dann freigegeben, bei acceptChoice, wird this zunächst gesperrt. Soweit ok, das hab ich getestet, das allein tut tatsächlich, was es soll.

Der Knackpunkt ist folgender. Sobald ich meinen Dialog sichtbar mache (über setVisible) im Konstruktor und ich dann die Methode sperre, die acceptChoice aufruft. 
Die sieht folgendermaßen aus:

```public void acceptChoice(final List<String> ids) {
		final InstallingAcceptDialog dialog = new InstallingAcceptDialog(this);
		Thread t = new Thread(new Runnable(){
			public void run() {
				dialog.acceptChoice(ids);
			}
		});
		t.start();
		
		synchronized (this) {
			try {
				this.wait();
				dialog.dispose();
				dialog.setVisible(false);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}```

Der Effekt ist: Das Fenster öffnet sich, und hat keinen Inhalt, da es, wie ich mal vermute, durch das wait gesperrt wird. 

Ich hab jetzt ein bisschen rumprobiert, aber es bringt alles nicht.

Hätte da jemand eine Idee?

Grüße
Morgyr


Edit: Inzwischen fällt mir auf, dass das komplett der falsche Ansatz ist und es ein modaler Dialog wohl auch getan hätte. Das Problem ist also in soweit umgangen und es funktioniert. Aber die richtige Lösung solcher Probleme würde mich dennoch interessieren.

Ich habe mit lesen bei

Ich brauche einen Dialog in Richtung der JOptionPane-Klasse. Sprich, einen Dialog, der solange das Programm blockiert, bis bspw. die Buttons Abbrechen oder Bestätigen gedrückt wird…

Mein Dialog ist ein normaler JFrame…

aufgehört.

Und hier ist vielleicht schon die Lösung übersehen worden.

Um das Programm durch einen Dialog so lange zu blockieren bis Eingaben gemacht oder Buttons gedrückt wurden sollte niemals ein JFrame genommen werden. Überhaupt sollte eine Anwendung nur einen JFrame haben - das Hauptfenster.
Alles andere, auch dein gesuchter Dialog, sollte mit einem JDialog gemacht werden. Einen JDialog kannst du auf modal setzen. Das bedeutet, solange dieser Dialog nicht geschlossen wurde, bleibt das Programm stehen.

Ok. Nehme ich so hin.

Diese Lösung hatte ich extra schon im Edit unten drin stehen. Ich hatte den Thread nur noch offen gehalten, weils es mir dann dennoch noch um die Thread-Geschichte ging. Auch wenn man JFrame nicht benutzen soll, sollte es doch grundsätzlich möglich sein, das ganze auch mit JFrame zu realisieren, oder liege ich da falsch?

Das ließe sich sicher machen, dazu müsstest du die Modal-Funktion in den JFrame implementieren, weil das Programm sonst in einem anderen Fenster forgesetzt werden kann.
Nimm lieber gleich den Weg über den JDialog, das erspart dir jede Menge Arbeit und Ärger.

Nun, gut. Danke.
Das werde ich dann besser mal lassen.