JDialog als Progress-Anzeige

NZPaul

Mitglied
Hallo zusammen,
ich sitze nun schon den ganzen Tag am selben Problem..
Ich möchte einen JDialog öffnen, dann eine Methode ausführen (die läuft etwas länger) und anschließend den Dialog wieder schließen. Der Dialog sagt einfach nur das gerechnet wird.
Das Frame, über welche der Dialog geöffnet wird, soll dabei blockiert werden.

Durch das setzen von Modal beim Dialog ist zumindest der letzte Punkt schon mal erfüllt.
Das Problem ist jedoch, dass dann der Thread von dem Frame komplett pausiert und somit meine Methode nicht ausgeführt wird..

Es ist leider auch nicht möglich die Methode in einen Extra Thread zu packen.

So soll das Programm vom Prinzip her ablaufen:
Java:
[...]
Dialog d = new Dialog(); //Dialog wird geöffnet
int i = methode(); //Methode, die lange rechnet und eine Rückgabe hat
d.close(); //Dialog wird wieder geschlossen
[...]

Ich würde mich sehr freuen, wenn mir jemand einen Tipp geben könnte!!

Gruß
Paul
 
Dialog d = new Dialog(); //Dialog wird geöffnet
int i = methode(); //Methode, die lange rechnet und eine Rückgabe hat

Das sieht für mich merkwürdig aus, insbesondere wenn der JDialog modal ist. dann wird natürlich die Methode erst aufgerufen, NACHDEM der Dialog geschlossen wurde.

Warum packst du den Aufruf der methode nicht IN den Dialog?

Den Rückgabewert deiner Methode kannst du über eine geschrieben Methode in JDialog abrufen.
 
Das sieht für mich merkwürdig aus, insbesondere wenn der JDialog modal ist. dann wird natürlich die Methode erst aufgerufen, NACHDEM der Dialog geschlossen wurde.

geanu das ist das Problem. 🙂
der Code entspricht auch nur meiner Wunschvorstellung, um zu verdeutlichen was ich erreichen möchte.

Ich hatte auch schon überlegt die Methode im Dialog erst auszuführen, aber ich finde das ist eine sehr unschöne Lösung.. Die Methode steht nämlich im keinen direkten Zusammenhang mit dem Dialog.
Der Dialog soll später auch an verschiedenen stellen im Programm angezeigt werden und dabei sollen immer unterschiedliche Methoden im Hintergrund abgearbeitet werden.
 
Zuletzt bearbeitet:
Ich hatte auch schon überlegt die Methode im Dialog erst auszuführen, aber ich finde das ist eine sehr unschöne Lösung.. Die Methode steht nämlich im keinen direkten Zusammenhang mit dem Dialog.
Der Dialog soll später auch an verschiedenen stellen im Programm angezeigt werden und dabei sollen immer unterschiedliche Methoden im Hintergrund abgearbeitet werden.

Das spricht aber NICHT dagegen, trotzdem den Funktionsaufruf IN den Dialog zu packen, oder?

Du kannst doch ein Interface definieren
Java:
public interface Excecutor {
    public Object run();
}

Dein Dialog bekommt eine Klasse, die das Interface implementiert, übergeben (vielleicht im Konstruktor) und der Dialog ruft einfach die run-Methode des Interfaces auf. Dann wird ja genau die Implementierung aufgerufen, also eine der unterschiedlich Methoden, die da im Hintergrund laufen sollen.

Das ist auch ein Grund, weshalb es gut ist, es in den Dialog zu packen. ALLE Stellen, an denen so etwas passieren soll, können den gleichen Dialog nutzen und bestimmte Methoden aufrufen lassen.
 
Perfekt!! 😀 :toll:

Ich hatte die Lösung also praktisch schon ;D Ich habe zuvor das Runnable Interface für genau diesen zweck verwenden wollen, aber hatte mit dem natürlich das Problem, dass die run-Methode keinen Rückgabewert hat.. Ich bin aber leider nicht auf die Idee gekommen ein eigenes Interface zuschreiben mit genau diesen Möglichkeiten.. 😳

Also vielen, vielen Dank!!
 
java.util.concurrent.Callable ist wohl das was du meintest.

PS: Vielleicht auch mal auf Danke klicken, wenn ich helfen konnte😉
 
Soo.. Leider habe ich mich etwas zu früh gefreut, da es noch nicht klappt.. :/ aber das ist bestimmt nur eine Kleinigkeit die ich nicht beachte ;D

Das Programm bleibt sofort stehen sobald der Dialog auf visible=true gesetzt wird..

ich habe es jetzt so:

Java:
//der Dialog
public class Dialog extends JDialog {

	private Callable<Object> toExecute;
	
	public DatabaseConnectionProgressBarMessage(Callable<Object> toExecute) {
		super();
		//Datenfelder initialisieren
		this.toExecute = toExecute;

		//JDialog Konfigurieren
		setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
		setModal(true);
	}

	public Object start() {
		//Dialog öffenen
		setVisible(true); //!!!!!!!!!!!!!!!hier bleibt das Programm stehen!!!!!!!!!!!!!!!

		//auszuführendes ausführen
		Object toReturn = null;
		try {
			toReturn = toExecute.call();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		//Dialog wieder schließen
		dispose();
		
		return toReturn;
	}
}

Java:
[...]
//wo der Dialog aufgerufen wird
Callable call = new Callable<Object>() {
     public Object call() throws Exception {
         return model.setServerData((ServerDataObject)event.getObject());
     }
   }

int i = (Integer)(new Dialog(call)).start();
[...]
 

Zurück
Oben