Spinner während Ladevorgang anzeigen
lima-city → Forum → Programmiersprachen → Java
anzeigen
blockieren
code
container
dank
darstellung
datum
dimension
import
lade
ladevorgang
modeln
pack
panel
programm
run
spinner
swing
url
zugriff
-
Hallo
Ich hole mir Daten aus dem Internet was mitunter ein wenig dauern kann.
Deshalb will ich während dem Ladevorgang einen Spinner anzeigen, da sonst die User drei vier mal Klicken.
Ich starte die Darstellung des Gifs in einem separaten Thread, welcher ein entsprechendes Panel auch anzeigt, aber das Gif nicht.
Sprich: Es wird ein neuer Frame angezeigt der das Gif anzeigen soll, dieser tut das aber nicht. Erst wenn der Ladevorgang abgeschlossen ist erscheint der Spinner. Na dann brauch ich ihn auch nicht mehr.
Auch mit einem simplen JLabel funktioniert das nicht.
Ich hab mir gedacht ich packs in einen Thread, da das Programm ja blockiert, solange der Ladevorgang läuft...
Das Laden der Daten kann ich auch nicht in einen Thread werfen, da sie zur weiteren Bearbeitung gebraucht werden...
Hat vieleicht jemand einen Hinweis worans liegen kann? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Ich nehme an du verwendest die swing-API?JLabel, schon klar.
Hast schon mal ein repaint() versucht?
Beitrag zuletzt geändert: 13.9.2012 16:47:02 von philippkern -
Poste doch den Code des GIF-Darstellungsthreads, das würde die Sache erleichtern...
Ebenfalls wäre der Code nicht schlecht, mit dem du den Thread erzeugst. -
Nun ja, ich bin im Moment so weit dass ich versucht hab den Spinner in einem separaten Frame vorzuladen, welchen ich dann eigentlich nur noch mit setVisible anzeigen lassen will...
Der Thread mit dem Frame sieht so aus:
package heron.view.conveyor.step.field; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class SpinnerStarter extends Thread { private JPanel m_panel; private JFrame j; public SpinnerStarter(JPanel panel) { m_panel = panel; j = new JFrame(); Container c = j.getContentPane(); c.add(new JLabel("Lade")); c.setPreferredSize(new Dimension(64,64)); j.pack(); } @Override public void run() { j.setVisible(true); } }
Bevor der Listener, der auf der Combobox sitzt das Model zum Laden der Daten aufruft wird folgender Code ausgeführt:
m_spinnerStarter.start();
-
Entweder mein letztes Java-Programm ist schon zu lange her, oder:
this.m_panel.add(this.j);
Fehlt das nicht? -
Nachdem es mir nicht möglich war einen Spinner auf dem Panel anzuzeigen habe ich was ganz simples probiert:
Ein JFrame, welcher schon im Konstruktor des Listeners der ComboBox initialisiert wird und welcher nur das JLabel "Lade" enthält.
Dieser soll bei der Auswahl oder besser gesagt, sobald der Listener aktiv wird, angezeigt werden. Ich habe ihn jetzt als separaten Thread gestartet. Der Frame erscheint, aber Text steht keiner drinnen. Also ob das Haupt-Programm auch die Darstellung des Threads blockiert...
Ich verstehts nicht. Gut, ich würde ja auch den Zugriff aufs Model in einen separaten Thread auslagern, aber ich will das Programm solange blockieren, damit der User nicht einfach weiter klickt...
@philippkern:
Das was du hier siehst ist der Thread, welcher den JFrame anzeigen soll. Wie du siehst wird der Frame im Konstruktor angelegt, gepackt nur halt eben noch nicht auf visible gesetzt. Die run-Methode wird erst ausgeführt, wenn ein Element ausgewählt wird und sollte sparat ablaufen. Aber irgendwie blockiert es...
Beitrag zuletzt geändert: 14.9.2012 8:31:47 von schrotti12 -
schrotti12 schrieb:
Ich verstehts nicht. Gut, ich würde ja auch den Zugriff aufs Model in einen separaten Thread auslagern, aber ich will das Programm solange blockieren, damit der User nicht einfach weiter klickt...
Mal ganz unabhängig von der Programmiersprache: ist es nicht so, wenn man verhindern will, dass jemand "einfach weiterklickt", dass es vernünftig wäre, die Schaltfläche einfach zu deaktivieren (also enabled auf false, sodass sie ausgegraut ist)? Wenn dein Worker-Thread dann fertig ist, kannst du die Schaltfläche wieder aktivieren lassen. -
Des hört sich gut an. Auf die Idee bin ich noch gar nicht gekommen. Ich schau gleich mal wie ich das in mein System einbauen kann! Wenn das Hauptprogramm nicht mehr blockiert, kann ich derweil ja immer noch einen Spinner anzeigen lassen... Guter Ansatz, danke!
Ich habs so gelöst: Datenbeschaffung in separatem Thread, welcher die GUI aktualisiert, sobald er fertig ist... Danke an alle für die Hilfe!
Beitrag zuletzt geändert: 14.9.2012 13:01:24 von schrotti12 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage