StatusMeldung anzeigen

Hallo,

ich möchte in meinem Applet eine StatusMeldung anzeigen während ich Daten vom Server hole.

Mein Applet hat dazu ein Label in dem ich den Meldungstext „loading data …“ anzeigen möchte. Wenn die Daten alle geholt wurden soll der
Text wieder gelöscht werden.

Mein Problem ist nun folgendes. Ich schreibe den Text kurz bevor ich mich zum Server verbinde. Angezeigt wird der Text aber erst wenn die Daten vom Server schon vorliegen d.h. ich brauche eine Möglichkeit den
Meldungstext sofort anzuzeigen. Ein Versuch mit labe.repaint brachte aber auch nichts. Wo und wie muß ich einen „Refresh“ machen. Ich lade übrigens Daten für einen Baum. Wenn man im Baum einen Knoten anklickt werden jeweils die Kinder vom Server geholt.

Alternativ habe ich versucht anstelle der Meldung einen Wait-Cursor anzuzeigen. Aber auch hier habe ich meine Probleme. Wenn ich einen Knoten im Baum anklicke setze ich den Wait-Cursor. Funktioniert auch! Die Daten werden dann geholt und in meinem Baum geschrieben. Mache ich
allerdings einen Doppelklick auf den Knoten, so wird der Wait-Cursor kurz angezeigt und geht wechselt aber wieder in den normale Cursor.
Wieso ?

Danke
Arni

Hallo,

ich möchte in meinem Applet eine StatusMeldung anzeigen
während ich Daten vom Server hole.

Mein Applet hat dazu ein Label in dem ich den Meldungstext
„loading data …“ anzeigen möchte. Wenn die Daten alle
geholt wurden soll der
Text wieder gelöscht werden.

Heißt das du benutzt das selbe Label für den Servertext und die Statusanzeige? bentutzt du setText(„bla bal“)? Wenn ja ich hatte noch keine Probleme damit.

Mein Problem ist nun folgendes. Ich schreibe den Text kurz
bevor ich mich zum Server verbinde. Angezeigt wird der Text
aber erst wenn die Daten vom Server schon vorliegen d.h. ich
brauche eine Möglichkeit den
Meldungstext sofort anzuzeigen. Ein Versuch mit labe.repaint
brachte aber auch nichts. Wo und wie muß ich einen „Refresh“
machen.

Ich nehme mal an du benutzt swing:
Hast du paint() überschrieben? wenn ja super.paint() - paintComponents() benutzt?,

Hallo,

Das bringt beides nichts. Ein paint bzw. repaint erzeugt im Swing-Thread bzw. AWT-Thread ein „zeichne dich neu“ Ereignis. Wenn jetzt die Netzwerk-Verbindung im gleichen Thread gemacht wird, so kann das Ereignis nicht verarbeitet werden. Die Netzwerk-Verbindung und das Daten holen sollte in einem eigenen Thread geschehen. Stichwort ist ist SwingWorker (wenn man Swing verwendet).

Gruß,
Frank

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Das bringt beides nichts. Ein paint bzw. repaint erzeugt im
Swing-Thread bzw. AWT-Thread ein „zeichne dich neu“ Ereignis.
Wenn jetzt die Netzwerk-Verbindung im gleichen Thread gemacht
wird, so kann das Ereignis nicht verarbeitet werden. Die
Netzwerk-Verbindung und das Daten holen sollte in einem
eigenen Thread geschehen. Stichwort ist ist SwingWorker (wenn
man Swing verwendet).

Gruß,
Frank

Hi Frank,

aber wenn ich zB

label.setText(„Lade“);
connect();

mach, dann muss das doch hinhauen??

SwingWorker ist für Performanzsteigerung und wenn arbeiten wirklich gleichzeit erledigt werden sollen. Soweit ich es hier verstanden, geht es nur darum vor dem Verbinden das Label zu akualisieren oder?

Hi oldschoolz,

Das bringt beides nichts. Ein paint bzw. repaint erzeugt im
Swing-Thread bzw. AWT-Thread ein „zeichne dich neu“ Ereignis.
Wenn jetzt die Netzwerk-Verbindung im gleichen Thread gemacht
wird, so kann das Ereignis nicht verarbeitet werden. Die
Netzwerk-Verbindung und das Daten holen sollte in einem
eigenen Thread geschehen. Stichwort ist ist SwingWorker (wenn
man Swing verwendet).

Gruß,
Frank

Hi Frank,

aber wenn ich zB

label.setText(„Lade“);
connect();

mach, dann muss das doch hinhauen??

Nein.

SwingWorker ist für Performanzsteigerung und wenn arbeiten
wirklich gleichzeit erledigt werden sollen. Soweit ich es hier
verstanden, geht es nur darum vor dem Verbinden das Label zu
akualisieren oder?

SwingWorker ist dazu da, den Swing-Thread zu entlasten. Spielen wir doch mal Deinen Code durch:
Durch label.setText(…) wird ein PropertyChangeEvent ausgelöst, dass indirekt zu einem repaint(…) führt. Beide Ereignisse werden i.d.R. durch den SwingThread bearbeitet.
Wenn nun der Aufruf von connect() (der im Swing-Thread stattfindet!!!) etwa 1 Minute dauert, so können die Ereignisse nicht bearbeitet werden. Also auch nicht das Repaint-Ereignis des Labels. Somit wird das Label erst nach dem connect() Aufruf aktualisiert.

Als kleinen Hack könnte man den connect() Aufruf auch durch SwingUtilities.invokeLater kapseln. Dann kann man wenigsten die letzen Ereignisse abarbeiten lassen und das Label sollte den richtigen Text anzeigen.

Persönlich würde ich dafür aber SwingWorker benutzen.

Gruß,
Frank

und wieder was gelernt