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.