Hallo Leute,
Ich dachte ich schreibe mal für die ganzen komplexen Vorgänge in meinem Programm einen Dialog, welcher ein Laden-GIF-Icon anzeigt während die Aktion getätigt wird.
Die Aktion an sich soll einfach über ein Runnable-Objekt beim Öffnen des Dialogs ausgeführt werden.
Mein Dialog stamtm wie gewohnt von JDialog ab und enthält die beiden Attribute "labelLoad" und "iconLoading", um einen Text und zweitens das GIF-Icon anzuzeigen.
Um unnötig viele Dialog zu verhindern hab ich den Konstruktor privat definiert, eine private statische Instanz hinzugefügt und veranlasst, dass der Dialog nur erzeugt werden kann, wenn sich die Attribute "owner" und "title" zur alten Instanz unterschiedlich sind.
Der Dialog wird dann mit dem Inhalt des Labels und dem Runnable-Objekt geöffnet
Im Konstruktor meines Dialogs wird ein WindowListener hinzugefügt über den in "windowOpened" die Run-Methode ausgeführt wird und anschließend der Dialog wieder geschlossen wird.
Wenn ich den Spaß jetzt nutzen will, wird beim ersten Mal die GIF nicht angezeigt, aber der Dialog wird zum Glück nach ein paar Sekunden geschlossen(wenn die Aktion durchgeführt ist). Wenn ich die gleiche Aktion nochmal ausführen will, wird der Dialog geöffnet und diesmal wird die GIF angezeigt, aber der Dialog schließt sich nicht mehr. Beide Male wird dieselbe Instanz benutzt
Problem 1 -> Beim ersten Aufruf scheint die Anzeige einer GIF im Label nicht zu funktionieren
Problem 2 -> Bei allen weiteren wird der WindowListener nicht mehr aufgerufen.
Idee zu 1. -> repaint()-Methode nach dem Konstruieren direkt aufrufen -> kein Effekt
Idee zu 2. -> "windowOpened" wird nur aufgerufen, wenn der Dialog zum ersten Mal geöffnet wird.
Habt ihr zu den beiden Problemen eine Idee, die ich ausprobieren könnte?
Es muss ja nicht über den WindowListener laufen. Bloß wie könnte ich sonst eine Aktion nach dem Aufruf von "setVisible(true)" ausführen. Schließlich blockt "setVisible(true)" bei einem Dialog diesen Thread.
Gruß, Thomas
Ich dachte ich schreibe mal für die ganzen komplexen Vorgänge in meinem Programm einen Dialog, welcher ein Laden-GIF-Icon anzeigt während die Aktion getätigt wird.
Die Aktion an sich soll einfach über ein Runnable-Objekt beim Öffnen des Dialogs ausgeführt werden.
Mein Dialog stamtm wie gewohnt von JDialog ab und enthält die beiden Attribute "labelLoad" und "iconLoading", um einen Text und zweitens das GIF-Icon anzuzeigen.
Um unnötig viele Dialog zu verhindern hab ich den Konstruktor privat definiert, eine private statische Instanz hinzugefügt und veranlasst, dass der Dialog nur erzeugt werden kann, wenn sich die Attribute "owner" und "title" zur alten Instanz unterschiedlich sind.
Java:
public static void createDialogInstane(JFrame owner, String title)
{
if (instance == null || !instance.getOwner().equals(owner)
|| !instance.getTitle().equals(title))
{
instance = new DLoad(owner, title);
}
}
Der Dialog wird dann mit dem Inhalt des Labels und dem Runnable-Objekt geöffnet
Java:
public static void showDialog(String loadMessage, Runnable runnableAction)
{
if (instance == null)
{
throw new NullPointerException(
"Dialog instance has to be created before trying open it!");
}
else
{
instance.runnableAction = runnableAction;
instance.labelLoad.setText("<html>" + loadMessage + "<br> </html>");
instance.setVisible(true);
}
}
Im Konstruktor meines Dialogs wird ein WindowListener hinzugefügt über den in "windowOpened" die Run-Methode ausgeführt wird und anschließend der Dialog wieder geschlossen wird.
Wenn ich den Spaß jetzt nutzen will, wird beim ersten Mal die GIF nicht angezeigt, aber der Dialog wird zum Glück nach ein paar Sekunden geschlossen(wenn die Aktion durchgeführt ist). Wenn ich die gleiche Aktion nochmal ausführen will, wird der Dialog geöffnet und diesmal wird die GIF angezeigt, aber der Dialog schließt sich nicht mehr. Beide Male wird dieselbe Instanz benutzt
Problem 1 -> Beim ersten Aufruf scheint die Anzeige einer GIF im Label nicht zu funktionieren
Problem 2 -> Bei allen weiteren wird der WindowListener nicht mehr aufgerufen.
Idee zu 1. -> repaint()-Methode nach dem Konstruieren direkt aufrufen -> kein Effekt
Idee zu 2. -> "windowOpened" wird nur aufgerufen, wenn der Dialog zum ersten Mal geöffnet wird.
Habt ihr zu den beiden Problemen eine Idee, die ich ausprobieren könnte?
Es muss ja nicht über den WindowListener laufen. Bloß wie könnte ich sonst eine Aktion nach dem Aufruf von "setVisible(true)" ausführen. Schließlich blockt "setVisible(true)" bei einem Dialog diesen Thread.
Gruß, Thomas