Swing keine JLabel-Aktualisierung bei "externem" Aufruf durch Helferklasse

Doc Cyber

Mitglied
Hallo zusammen!

Wenn ich die setText-Methode eines JLabel-Objekt durch einen Aufruf (quasi ein Rückruf)aus einer Helferklasse ausführe, wird der Label nicht aktualisiert. Neben setText() habe ich noch verschiedenes probiert: repaint(), repaint(1), validate, revalidate.
(Auch ein repaint() etc des übergeordneten JPanel zeigt keinerlei Wirkung.)

Das untenstehende Beispiel-Progrämmchen ist lauffähig.
Der Code besteht nur aus wenigen Zeilen, verteilt auf zwei Klassen.

Habt Dank für jede hilfreiche Antwort. :)
Java:
package test.labels;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JLabel;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class LabelTest extends JFrame {

   private JPanel contentPane;
   private JLabel infoLabel;
  
   public LabelTest() {
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     setBounds(0, 0, 160, 120);
     contentPane = new JPanel();
     setContentPane(contentPane);
     contentPane.setLayout(null);
    
     JButton btnNewButton = new JButton("do something");
     btnNewButton.addActionListener(new ActionListener() {
       public void actionPerformed(ActionEvent e) {
         LabelHelper helper = new LabelHelper(infoLabel, contentPane);
         helper.doSomething();
       }
     });
     btnNewButton.setBounds(10, 11, 126, 23);
     contentPane.add(btnNewButton);
    
     infoLabel = new JLabel("info");
     infoLabel.setBounds(10, 60, 126, 14);
     contentPane.add(infoLabel);
   }
  
   public static void main(String[] args) {
     EventQueue.invokeLater(new Runnable() {
       public void run() {
         try {
           LabelTest frame = new LabelTest();
           frame.setVisible(true);
           frame.setLocationRelativeTo(null);
         } catch (Exception e) {
           e.printStackTrace();
         }
       }
     });
   }
}

package test.labels;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class LabelHelper {
   private JLabel infoLabel;

   public LabelHelper(JLabel infoLabel) {
     this.infoLabel = infoLabel;
   }
  
   public void doSomething() {
     for (int i = 1; i<= 3; i++) {
       // infoLabel wird nicht aktualisiert!
       infoLabel.setText("Meldung " + i);
       try {
         Thread.sleep(1000);
       } catch (InterruptedException e) {
         e.printStackTrace();
       }
     }
     infoLabel.setText("Fertig");
   }
}
 

Anhänge

  • labels.zip
    1,1 KB · Aufrufe: 0
Zuletzt bearbeitet von einem Moderator:

Joose

Top Contributor
Der Code funktioniert schon so richtig ;)
Du drückst den Button, deine UI friert für 3 Sekunden ein und danach steht eben "Fertig" am Label.

Das Problem ist das du den Aufruf von "Thread.sleep" im selben Thread ausführst wie das "setText". Dadurch legst du den Thread schlafen und er kann natürlich die UI nicht neu zeichnen.
Dann wacht er wieder auf und führt wieder "setText" aus und danach "sleep". Das ganze sooft bis die Schleife zu Ende ist und dann eben "Fertig" in das Label schreibt.
Danach ist er fertig und kann neu zeichnen.

Hier eine genauere Erklärung warum die UI einfriert: http://stackoverflow.com/questions/15616660/gui-freeze-after-click-on-button
Mit Hilfe des SwingWorker könnte man so etwas realisieren: http://stackoverflow.com/questions/782265/how-do-i-use-swingworker-in-java
 

Doc Cyber

Mitglied
Das Problem ist das du den Aufruf von "Thread.sleep" im selben Thread ausführst wie das "setText". Dadurch legst du den Thread schlafen und er kann natürlich die UI nicht neu zeichnen.

Hallo Joose,

danke für deine Antwort.
Mir ist schon klar, dass mein Code korrekt funktioniert. :)

Das sleep(1000) dient im Beispiel ja auch nur zur Illustration des Effektes. (FALLS es denn zu einer Aktualisierung käme, würde man ohne diese Verzögerung ja am Bildschirm nichts sehen, weil es zu schnell ginge.)
In meiner echten Anwendung habe ich sehr zeitaufwendige Operationen, und da brauche ich kein sleep() - im Gegenteil. Allerdings möchte ich eine Rückmeldung über den Fortschritt dieser Operationen.
Und da besteht eben das Problem, welches ich simplifiziert gepostet hatte.

Ich schau mir jetzt mal deine Links an und hoffe, dass ich dort fündig werde.
 

strußi

Top Contributor
vor deinem try-Teil nach dem du setText() aufgerufen hast noch ein infoLabel.upadeUI(); dann zeichnet er neu bevor er in den sleep geht
 

Joose

Top Contributor
Das sleep(1000) dient im Beispiel ja auch nur zur Illustration des Effektes. (FALLS es denn zu einer Aktualisierung käme, würde man ohne diese Verzögerung ja am Bildschirm nichts sehen, weil es zu schnell ginge.)

Das ist mir schon klar das du damit nur die Verzögerung simulieren wolltest.
Aber durch den ActionListener wird der Code im EDT ausgeführt, wenn du diesen per sleep schlafen legst, kann er die UI nicht neuzeichnen.

In meiner echten Anwendung habe ich sehr zeitaufwendige Operationen, und da brauche ich kein sleep() - im Gegenteil. Allerdings möchte ich eine Rückmeldung über den Fortschritt dieser Operationen.

Zeitaufwändige Operationen sollten immer in eigene Threads ausgelagert werden (vor allem wenn mit einer UI dazu gearbeitet wird), dadurch ist eben so eine Darstellung des Fortschritts möglich.

Die Stichwörter zu diesem Problem sind: EventDispatcherThread, SwingWorker, SwingUtilities, invokeLater, ......

EDIT: Es gibt wie strußi auch zeigt Möglichkeiten ein Update der UI zu erzwingen was aber in diesem Fall unnötig wäre. Deine UI wird sowieso neu gezeichnet (zu sehen daran das nach 3 Sekunden das Label auf "Fertig" geändert wird). Man darf halt nur nicht den "Zeichen"thread schlafen legen ;)
Daher finde ich die Variante von strußi auch nicht geeigent in diesem Fall.
 

Doc Cyber

Mitglied
Die Stichwörter zu diesem Problem sind: EventDispatcherThread, SwingWorker, SwingUtilities, invokeLater, ......

Habe ich alles schon mehrfach gelesen, aber bislang nicht gebraucht und mich deshalb auch noch nicht näher damit beschäftigt. Jetzt scheint es aber notwendig zu sein.
Ich melde mich wieder - entweder mit der konkreten Lösung meines Beispielproblems, oder mit weiteren Fragen.

Zunächst herzlichen Dank; du hast mir geholfen, der Lösung auf die Spur zu kommen.
 

Doc Cyber

Mitglied
vor deinem try-Teil

Du meinst so:
Java:
  public void doSomething() {
     for (int i = 1; i<= 3; i++) {
       // infoLabel wird nicht aktualisiert!
       infoLabel.setText("Meldung " + i);
       infoLabel.updateUI(); // <== nutzt nichts!
       contentPane.updateUI(); // <== auch kein Effekt!
       try {
         Thread.sleep(1000);
       } catch (InterruptedException e) {
         e.printStackTrace();
       }
     }
     infoLabel.setText("Fertig");
   }

Aber leider hilft das alles nicht weiter. Kein Effekt.
 
Zuletzt bearbeitet von einem Moderator:

Neumi5694

Top Contributor
Füge ein setText mal in den ActionListener ein, bevor du die externe Klasse aufrufst.
Merkst du was? Auch dieser Text wird nicht angezeigt. Die UI wird erst dann neu gezeichnet, wenn der ActionListener beendet ist.
Starte also den Aufruf des Helpers in einem eigenen Thread.
Was du hierfür verwendest, bleibt dir überlassen. EventQue funktioniert genauso gut, wie das, was ich dir hier zeige.
Java:
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                new Thread() {
                    public void run() {
                        LabelHelper helper = new LabelHelper(infoLabel);
                        helper.doSomething();
                    }
                }.start();
            }
        });
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H String teilen, damit bei JLabel keine Punkte am Ende angezeigt werden AWT, Swing, JavaFX & SWT 4
B Keine Änderungen an JLabel durch Array möglich AWT, Swing, JavaFX & SWT 12
ExceptionOfExpectation JMenu, setMnemonic(Char k) bringt keine Wirkung AWT, Swing, JavaFX & SWT 8
V JavaFX Bild leer und keine Fehlermeldung AWT, Swing, JavaFX & SWT 21
S JavaFX WebView zeigt keine Animation AWT, Swing, JavaFX & SWT 5
ruutaiokwu SWT "Google Window Builder" tut keine jar's ins Projekt rein bei SWT-Projekt AWT, Swing, JavaFX & SWT 22
L Java FX Keine Anzeige Im Tableview AWT, Swing, JavaFX & SWT 4
richis-fragen JTree +/- verschwidet wenn Knoten keine Kinder hat... AWT, Swing, JavaFX & SWT 6
S java.fxml.load.exception und keine automatische Aktualliseriung der Mainausgabe AWT, Swing, JavaFX & SWT 5
F JList zeigt keine Einträge mehr AWT, Swing, JavaFX & SWT 1
G Swing JButton - Keine Klickanimation AWT, Swing, JavaFX & SWT 4
G JavaFX - Während AudioRecording keine Text eingabe TextField möglich AWT, Swing, JavaFX & SWT 6
N Swing JFormattedTextField keine Werte nach Formatzuweisung AWT, Swing, JavaFX & SWT 0
C Swing JList zeigt keine neuen Einträge an AWT, Swing, JavaFX & SWT 1
X Swing Anwendung regaiert auf keine Buttons mehr wärend while(scanner.hasNextLine()) ausgeführt wird. AWT, Swing, JavaFX & SWT 4
D Swing Warum erhalte ich keine Ausgabe? Funktioniert der equals-vergleich in actionPeformed nicht richtig? AWT, Swing, JavaFX & SWT 3
K Swing Keine Reaktion auf Tastatureingaben bei mehreren Buttons??? AWT, Swing, JavaFX & SWT 4
gamebreiti auf usereingabe warten mit GUI(nur Labels, Buttons etc. keine Texteingaben) AWT, Swing, JavaFX & SWT 3
P Swing JTable keine Markierung nach Button klick AWT, Swing, JavaFX & SWT 0
U Frame zeigt keine Komponenten AWT, Swing, JavaFX & SWT 7
H RCP(SWT) Browser-Widget zeigt keine locale HTML-Dateien an AWT, Swing, JavaFX & SWT 1
N JavaFX Keine Dynamic AWT, Swing, JavaFX & SWT 2
W Swing Ausführung einer .jar zeigt keine Reaktion AWT, Swing, JavaFX & SWT 4
D Swing JList keine Selektionsänderung bei "dragged-Maus" AWT, Swing, JavaFX & SWT 4
N Swing JTable mit Sorter: Keine Sortierung bei Klick in Header AWT, Swing, JavaFX & SWT 3
Ollek JList - neuer Eintrag in ArrayList dadurch keine Anzeige der Objekte AWT, Swing, JavaFX & SWT 18
A trotz setSize keine breite AWT, Swing, JavaFX & SWT 4
Q JTable - Keine Spaltennamen AWT, Swing, JavaFX & SWT 3
H Swing Keine Rückmeldung (freeze) bei setVisible(false) oder dispose() AWT, Swing, JavaFX & SWT 4
B JEditorPane lädt keine Schriftfarbe in HTML AWT, Swing, JavaFX & SWT 2
dzim TableView - keine Aktualisierung geänderter Items AWT, Swing, JavaFX & SWT 5
E Keine Ausgabe auf Console und List AWT, Swing, JavaFX & SWT 13
Kenan89 statischer ActionListener keine Wirkung? AWT, Swing, JavaFX & SWT 2
Kenan89 statischer ActionListener keine Wirkung? AWT, Swing, JavaFX & SWT 3
N Swing Netbeans 7.1 keine DesktopApplication mehr möglich ? AWT, Swing, JavaFX & SWT 15
H JTable zeigt keine Daten an AWT, Swing, JavaFX & SWT 5
C Swing JFrame nimmt keine anderen Elemente auf AWT, Swing, JavaFX & SWT 13
K Applet Wieso kann ich keine Array im Applet initialisieren AWT, Swing, JavaFX & SWT 13
A Swing JTable benutzt keine Checkbox für Booleans AWT, Swing, JavaFX & SWT 9
M Swing Focus für Buttons deaktiviert --> keine Reaktion mehr auf Tastendrücke AWT, Swing, JavaFX & SWT 5
E Keine Ausgabe von JList bei drücken von Button auf die Konsole AWT, Swing, JavaFX & SWT 7
C MouseMotionListener fired keine Events mehr wenn in Button AWT, Swing, JavaFX & SWT 2
D Fenster will keine Ausgabe geben>:( AWT, Swing, JavaFX & SWT 3
K Applet erkennt keine Frameverkleinerung AWT, Swing, JavaFX & SWT 5
O keine ähnliche Farben durch Random in Java AWT, Swing, JavaFX & SWT 21
N JFileChooser - Keine Funtkion AWT, Swing, JavaFX & SWT 13
P Kennt awt.list keine Tastatureingabe? AWT, Swing, JavaFX & SWT 3
Y LayoutManager Keine vollständige Darstellung der Tabelle mit GridBagLayout AWT, Swing, JavaFX & SWT 3
H Swing JScrollPane bekommt keine ScrollBars AWT, Swing, JavaFX & SWT 5
bluerob Nach RowSorter -> Keine Tabellenüberschreibung möglich AWT, Swing, JavaFX & SWT 7
V JTextField nimmt keine Eingaben an, nach nachträglichem setVisible des JWindows AWT, Swing, JavaFX & SWT 4
aze JTextField:Keine Markierung AWT, Swing, JavaFX & SWT 6
D Swing keine Tabellen Zeilen ohne Focus AWT, Swing, JavaFX & SWT 7
J Swing JTable, eigener TableCellRenderer Keine Anzeige in den Zellen AWT, Swing, JavaFX & SWT 8
C keine weiteren Events während Drag&Drop Operation möglich? AWT, Swing, JavaFX & SWT 5
Fu3L Keine Transparenten JTextComponents möglich mit Nimbus L&F? AWT, Swing, JavaFX & SWT 5
P 2D-Grafik PaintComponent() übernimmt keine Werte aus update() AWT, Swing, JavaFX & SWT 8
earlgrey_tea AWT KeyListener bekommt keine Signale AWT, Swing, JavaFX & SWT 3
B LayoutManager mischen keine gute Idee? AWT, Swing, JavaFX & SWT 9
O Swing es können keine neuen Labels hinzufügt werden während der Timer läuft AWT, Swing, JavaFX & SWT 14
B JScrollbarPane zeigt keine scrollbars AWT, Swing, JavaFX & SWT 2
I Panel scheint keine Größe zu haben AWT, Swing, JavaFX & SWT 3
aze GridLayout: Keine automatische Ausdehnung AWT, Swing, JavaFX & SWT 2
1 JFrame bleibt leer, keine Ahnung warum AWT, Swing, JavaFX & SWT 7
M SWT keine Scrollbar bei widgets.List und GridLayout AWT, Swing, JavaFX & SWT 2
P SWT Tree - Keine Selection zulassen AWT, Swing, JavaFX & SWT 4
T SWT Keine Anzeige der Widgets nach Comboauswahl AWT, Swing, JavaFX & SWT 2
1 GeneralPath-Kreise werden keine Kreise AWT, Swing, JavaFX & SWT 2
hdi Swing setPreferredSize zeigt keine Änderung AWT, Swing, JavaFX & SWT 2
R AWT [Anfänger] keine atives Aussehen von Buttons AWT, Swing, JavaFX & SWT 4
S Seltsames Problem - manchmal enthaelt die ActionMap eine JTextArea keine Actions. AWT, Swing, JavaFX & SWT 4
A SWT Table hat keine Scrollbar AWT, Swing, JavaFX & SWT 12
C Frame repaint hat keine Wirkung AWT, Swing, JavaFX & SWT 6
L Swing JPanel sendet keine KeyEvents AWT, Swing, JavaFX & SWT 22
J Swing - ich sehe keine Linie, andere schon AWT, Swing, JavaFX & SWT 6
S JDialog gibt keine Nachrichten ueber sein Schliessen..? AWT, Swing, JavaFX & SWT 3
C JTextArea zeigt keine Scrollbalken AWT, Swing, JavaFX & SWT 18
B Heavyweight Popup lässt keine MouseEvents durch AWT, Swing, JavaFX & SWT 2
K JDialog zeigt keine Komponenten wenn es modal ist AWT, Swing, JavaFX & SWT 2
S Seltsam: SWT Table zeigt keine Scrollbar an AWT, Swing, JavaFX & SWT 12
V JTabbedPane - keine "Focus"-Box auf selektiertem T AWT, Swing, JavaFX & SWT 2
G JTable zeigt keine Spaltenheader AWT, Swing, JavaFX & SWT 7
L JDialog-kann keine Größe setzen AWT, Swing, JavaFX & SWT 4
F Thread macht keine Pause AWT, Swing, JavaFX & SWT 22
W Threads und trotzdem keine Nebenläufigkeit AWT, Swing, JavaFX & SWT 13
G Keine Anzeige des Balkens AWT, Swing, JavaFX & SWT 3
F JScrollPane mit JPanel drinne zeigt keine Scroll-Leisten AWT, Swing, JavaFX & SWT 7
K keine Zeichenfläche sichtbar AWT, Swing, JavaFX & SWT 2
J ActionListener nimmt keine for()-Schleife? AWT, Swing, JavaFX & SWT 4
M JDialog + JFrame + keine Java Tasse AWT, Swing, JavaFX & SWT 9
G keine ScaledInstance von BufferedImage? AWT, Swing, JavaFX & SWT 6
Z habe code, habe fehler, habe keine lösung AWT, Swing, JavaFX & SWT 7
C Jar Datei ist ausführbar aber zeigt keine icon's an AWT, Swing, JavaFX & SWT 18
S JList gibt nach Sortierung mit Collections keine Anzahl mehr AWT, Swing, JavaFX & SWT 3
N Trotz richtiger ListSelectionMode kann ich keine Zeile sel? AWT, Swing, JavaFX & SWT 4
technolion FileDialog/keine Multi-Selektion vs. JFileCHooser/kein LaF AWT, Swing, JavaFX & SWT 2
S getSize gibt keine Größe wieder AWT, Swing, JavaFX & SWT 4
K Keine SWT-Komponenten-Gruppe in Palette des Visual Editor AWT, Swing, JavaFX & SWT 2
M Keine Buttons oder sonstige Objekte in JFrame unter Linux AWT, Swing, JavaFX & SWT 4
W Vom JPanel bekomme ich keine Events AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben