JavaFX Label flackert beim aktualisieren

D

Der_AltMann

Mitglied
Ich habe eine Scrollpane, in der eine Vbox ist, in der mehrere Flowpanes sind, die mehrere Hboxen enthalten. In diesen Hboxen befindet sich dann immer 2 Labels.
Wenn ich das Fenster so klein habe, dass 5 Hoxen in einer Reihe sind ist alles gut, mache ich das Fenster jedoch größer fangen die Hboxen/Labels an zu flackern wenn sie ihren Wert aktualisieren.
1605794992267.png

Das weiße oben rechts ist das "flackern". Die ganze Hbox flackert, ich aktualisiere aber nur ein Element in der Box.

Das Label wird so aktualisiert(Labels habe ich in "map" gespeichert):
Java:
Platform.runLater(() -> {

                try {
                    if (map.containsKey(signal)) {
                        if (map.get(signal) instanceof Label) {
                            if (valueToDisplay == Double.MIN_VALUE) {
                                // if the value dont have decimal places it is better to display an integer
                                // instead of double
                                ((Labeled) map.get(signal)).setText(String.valueOf(value));
                                System.out.println("setValue: " + signal + " value: " + value);
                            } else {
                                ((Labeled) map.get(signal)).setText(String.valueOf(valueToDisplay));
                                System.out.println("setValue: " + signal + " value: " + valueToDisplay);
                            }

Die Labels werden von einem 2 Thread aktualisiert. Das komische ist, wenn ich das Fenster erst maximiere und dann den Thread starte gibt es keine Probleme.
Ich habe auch noch 3 Buttons, mit denen ich den Thread starte und stoppe. Wenn ich den Thread gestoppt hab (nicht maximiert gestartet) dann werden die Buttons auch so "weiß" wenn ich mit der Maus drüber fahre.
1605795353271.png

Vielleicht hat jemand sowas schonmal gesehen :)
 
Thallius

Thallius

Top Contributor
UI Änderungen sollte man nicht in einem anderen Thread machen als dem UI Thread. Benutze einfach ein invokeLater bei den Änderungen
 
kneitzel

kneitzel

Top Contributor
UI Änderungen sollte man nicht in einem anderen Thread machen als dem UI Thread. Benutze einfach ein invokeLater bei den Änderungen
Das scheint er ja zu beherzigen ... Was mir einfallen würde: hast Du für eine Änderung evtl. mehrere invokeLater?
Dann könnte es sein, dass er zwischen den einzelnen invokeLater die paint Messages hat und bearbeitet. Soweit ich mich erinnere haben die paint Nachrichten Vorrang, also wenn Du mehrere Events an eine Applikation gibst, dann werden alle WM_PAINT zuerst abgearbeitet.

Aber das ist schon zu lange her - da konnte man Windows Programme noch schön in C schreiben ohne schräg angesehen zu werden :) Also vielleicht Verwechsel ich da jetzt auch was...
 
Thallius

Thallius

Top Contributor
Das scheint er ja zu beherzigen ... Was mir einfallen würde: hast Du für eine Änderung evtl. mehrere invokeLater?
Dann könnte es sein, dass er zwischen den einzelnen invokeLater die paint Messages hat und bearbeitet. Soweit ich mich erinnere haben die paint Nachrichten Vorrang, also wenn Du mehrere Events an eine Applikation gibst, dann werden alle WM_PAINT zuerst abgearbeitet.

Aber das ist schon zu lange her - da konnte man Windows Programme noch schön in C schreiben ohne schräg angesehen zu werden :) Also vielleicht Verwechsel ich da jetzt auch was...

Ist runLater das gleiche wie invokeLater? Ist bei mir auch schon paar Jahre her das ich Swing genutzt habe.
 
kneitzel

kneitzel

Top Contributor
Ist runLater das gleiche wie invokeLater? Ist bei mir auch schon paar Jahre her das ich Swing genutzt habe.
Nein. Das eine ist JavaFX (Platform.runLater) und das andere ist Swing (SwingUtilities.invokeLater).

Aber prinzipiell machen Beide das gleiche: Es wird ein Event generiert, dass dann vom Event Dispatch Thread verarbeitet und ausgeführt wird. Dazu nehmen beide ein Runable als Parameter.
 
D

Der_AltMann

Mitglied
Das scheint er ja zu beherzigen ... Was mir einfallen würde: hast Du für eine Änderung evtl. mehrere invokeLater?
Dann könnte es sein, dass er zwischen den einzelnen invokeLater die paint Messages hat und bearbeitet. Soweit ich mich erinnere haben die paint Nachrichten Vorrang, also wenn Du mehrere Events an eine Applikation gibst, dann werden alle WM_PAINT zuerst abgearbeitet.

Aber das ist schon zu lange her - da konnte man Windows Programme noch schön in C schreiben ohne schräg angesehen zu werden :) Also vielleicht Verwechsel ich da jetzt auch was...
Es ist nur eine invokeLater, diese wird aber sehr oft ausgeführt. Mit dem Programm überwache ich Lin Kommunikation und jedes Mal, wenn ein neuer Wert auf den Bus kommt aktualisiere ich die GUI mit diesem Wert(über die invokeLater). Das Komische ist halt wirklich, dass der Bug nicht auftritt, wenn ich das Fenster vorm starten der Kommunikation schon maximiere.
 
dzim

dzim

Top Contributor
Nur so als Idee: kann es sein, dass du immer noch *zu viel* in deinem #runLater machst?
Ich würde dort wirklich *nur* die Labels setzen, nicht suchen, Text vorbereiten und dann rein machen. Du kannst auch von anderen Threads mit UI-Komponenten interagieren, solange du sie nicht manipulierst. Nur die Manipulation muss dann ins #runLater.

Aber wie gesagt ist das nur eine Idee. Ich hab keine konkrete Ahnung, warum es sich bei dir so verhält (vor allem wenn du eigentlich gerade weniger anzeigst).
 
D

Der_AltMann

Mitglied
Nur so als Idee: kann es sein, dass du immer noch *zu viel* in deinem #runLater machst?
Ich würde dort wirklich *nur* die Labels setzen, nicht suchen, Text vorbereiten und dann rein machen. Du kannst auch von anderen Threads mit UI-Komponenten interagieren, solange du sie nicht manipulierst. Nur die Manipulation muss dann ins #runLater.

Aber wie gesagt ist das nur eine Idee. Ich hab keine konkrete Ahnung, warum es sich bei dir so verhält (vor allem wenn du eigentlich gerade weniger anzeigst).
danke für den Tipp, tatsächlich habe ich das schon versucht aber es verhält sich genau gleich
 
dzim

dzim

Top Contributor
Kannst du das in einem kleinen und selbständig lauffähigen Beispiel hier im Code zur Verfügung stellen? Dann könnte ich es auf Linux und Windows mal ausprobieren. Und vielleicht auch auf unterschiedlichen JavaFX-Version und Java-Installationen...
 
D

Der_AltMann

Mitglied
Kannst du das in einem kleinen und selbständig lauffähigen Beispiel hier im Code zur Verfügung stellen? Dann könnte ich es auf Linux und Windows mal ausprobieren. Und vielleicht auch auf unterschiedlichen JavaFX-Version und Java-Installationen...
Danke für die Hilfe, als ich ein selbständig lauffähigen Beispiel erstellen wollte, habe ich herausgefunden an welcher Zeile Code das Problem liegt.
Ich setze noch den Style von jedem Label, nachdem ich den Inhalt update:
Java:
map.get(signal).setStyle("-fx-font-weight: bold;");
genau daran liegt es. Ich habe auch schon versucht, es mit Platform.runlater zu machen aber das Resultat ist das selbe.
Wenn ich diese Zeile aus kommentiere funktioniert alles wunderbar.
Warum das Probleme macht weiß ich allerdings nicht
 
dzim

dzim

Top Contributor
Ah... CSS und JavaFX. Ein Segen und ein Fluch zugleich. Den Style im Code zu setzen ist eh immer etwa heikel. in 99% der Fälle alles ok, aber das eine Prozent dann...
Am Besten steigst du auf normale, und wenn nötig auch Pseudo-, -Klassen um - mit denen habe ich eigentlich gute Erfahrungen gemacht.
 
D

Der_AltMann

Mitglied
Ah... CSS und JavaFX. Ein Segen und ein Fluch zugleich. Den Style im Code zu setzen ist eh immer etwa heikel. in 99% der Fälle alles ok, aber das eine Prozent dann...
Am Besten steigst du auf normale, und wenn nötig auch Pseudo-, -Klassen um - mit denen habe ich eigentlich gute Erfahrungen gemacht.
ah okay danke für die Info :) meinst du mit Klassen dann CSS-Klassen, die ich über den Code setze?
 
dzim

dzim

Top Contributor
Also idealerweise hängt man immer seine eigenen Style-Klassen ran (im Code oder im FXML). Und lässt sie dort!

Wenn man dann etwas aufgrund einer speziellen Situation ändern möchte, kann man dann noch Style-Klassen im CSS definieren und sie im Code (und soweit ich weiss nur dort) aktivieren oder deaktivieren.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J JavaFX Label aktualisieren AWT, Swing, JavaFX & SWT 18
M JavaFX javaFX Label-Text wird nicht gesetzt AWT, Swing, JavaFX & SWT 3
T Anderen Java Code durch Code kompilieren und Fehler in Label ausgeben AWT, Swing, JavaFX & SWT 5
I BoxLayout zentriert Label nicht AWT, Swing, JavaFX & SWT 7
B Ausgaben einer Umrechnung vom Textfeld in ein Label AWT, Swing, JavaFX & SWT 2
R JavaFX Label oder Imageview anzeigen mit Buttonklick AWT, Swing, JavaFX & SWT 4
L Label im JavaFX Thread Updaten AWT, Swing, JavaFX & SWT 3
A Inhalt wechseln bei Klick auf Label AWT, Swing, JavaFX & SWT 8
ralfb1105 JavaFX Label lässt sich innerhalb service Task nicht updaten? AWT, Swing, JavaFX & SWT 22
Trèfle JavaFX Formattierung im Label AWT, Swing, JavaFX & SWT 3
ralfb1105 JavaFX Wie Text Label in neuem Window von Main Stage setzen? AWT, Swing, JavaFX & SWT 6
F Countdown in Label anzeigen AWT, Swing, JavaFX & SWT 14
H JavaFX - Label aktualisieren AWT, Swing, JavaFX & SWT 1
J Dateiname im Label einblenden AWT, Swing, JavaFX & SWT 4
C SWT autosize bei gc.drawString() auf einem Label AWT, Swing, JavaFX & SWT 7
xYurisha Aus einer Gui Buttons, Label und ProgessBars entfernen AWT, Swing, JavaFX & SWT 4
T Label wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
zhermann FX Label text wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 12
zhermann NullPointerException bei Label.setText() AWT, Swing, JavaFX & SWT 5
T JavaFX Label mit mehreren Images AWT, Swing, JavaFX & SWT 11
Kanda Sorata Inhalt einer .txt Datei einlesen und in ein Label einfügen (JavaFX) AWT, Swing, JavaFX & SWT 2
L JavaFX ContextMenu bei Label mit Linksklick AWT, Swing, JavaFX & SWT 4
J JavaFX - Felder (Label) in einer ForSchleife bearbeiten AWT, Swing, JavaFX & SWT 4
N Anordnung der Label AWT, Swing, JavaFX & SWT 3
N Swing Label auf Panel legen.. AWT, Swing, JavaFX & SWT 2
D JavaFX Label lässt sich nicht mehrmals färben AWT, Swing, JavaFX & SWT 7
R Swing JLabel berührung an einem anderen Label prüfen AWT, Swing, JavaFX & SWT 3
U Java FX Zusätzliches Label per Knopfdruck während der Laufzeit auf Panel einfügen. AWT, Swing, JavaFX & SWT 2
M Text in einem Label fett setzen AWT, Swing, JavaFX & SWT 4
D Swing JFreeChart Crosshair Label - setPreferredSize oder ähnliches, aber wo ? AWT, Swing, JavaFX & SWT 1
T CSS Rechtsbüdniges Label mit Zwei Zeilen AWT, Swing, JavaFX & SWT 7
J JavaFX Translation Text/Label AWT, Swing, JavaFX & SWT 2
Tom299 JavaFX Text oder Label benutzen AWT, Swing, JavaFX & SWT 4
C Textfeld und Label werden nicht angezeigt (Ubuntu) AWT, Swing, JavaFX & SWT 2
C SWT Treeview mit Bilder im Label verändert Expanded Icon AWT, Swing, JavaFX & SWT 1
Augenblau JavaFX Wechselnde Werte in Label darstellen AWT, Swing, JavaFX & SWT 7
V Swing Brauche Hilfe mit Label AWT, Swing, JavaFX & SWT 3
S JButton-Label vergrößern AWT, Swing, JavaFX & SWT 2
D Java Swing, Label lässt sich nicht mit Checkboxen/Knopf verändern AWT, Swing, JavaFX & SWT 2
M label mit icon verschieben. AWT, Swing, JavaFX & SWT 1
B Swing JXMapKit Mausemove in Label anzeigen AWT, Swing, JavaFX & SWT 0
K Bild in Label wird nicht angezeigt AWT, Swing, JavaFX & SWT 5
S JButton u. Label auf paint-Methode AWT, Swing, JavaFX & SWT 1
G Label wird nicht erstellt AWT, Swing, JavaFX & SWT 0
7 AWT problem: KeyListener/ test im Label umändern AWT, Swing, JavaFX & SWT 4
W JavaFX Label in Controller-Klasse in einer anderen Controller-Klasse ändern AWT, Swing, JavaFX & SWT 9
D Swing [Frage] ComboBox + Label AWT, Swing, JavaFX & SWT 3
G Label erstellen AWT, Swing, JavaFX & SWT 6
U Label zeigt nicht überall HTML Zeichen AWT, Swing, JavaFX & SWT 3
F JavaFX label.getWidth() AWT, Swing, JavaFX & SWT 2
T Swing Label aus anderer Methode bearbeiten AWT, Swing, JavaFX & SWT 2
N Input/Output Stream werte in Label anzeigen. AWT, Swing, JavaFX & SWT 6
R JavaFX Label ändern in aufgerufener AnchorPane AWT, Swing, JavaFX & SWT 3
B Swing label.setText() macht probleme AWT, Swing, JavaFX & SWT 5
G JavaFX CSS: Label in GridPane rechts ausrichten AWT, Swing, JavaFX & SWT 9
T Swing Aktuelle Größe eines Textes in einem Label darstellen AWT, Swing, JavaFX & SWT 3
KrokoDiehl Swing Buchstaben im Label anders färben AWT, Swing, JavaFX & SWT 4
K Zugriff auf Label und Ereignisbehandlung durch zwei Handlerklassen AWT, Swing, JavaFX & SWT 3
P Label rotieren mit Timer AWT, Swing, JavaFX & SWT 5
C Label wird nicht an der richtigen Position angezeigt.. AWT, Swing, JavaFX & SWT 7
H Label mit Icon positionieren AWT, Swing, JavaFX & SWT 14
E Netbeans: Buttons mit Label bzw. Rahmen unterlegen AWT, Swing, JavaFX & SWT 8
J resize - Label bleibt erst schwarz AWT, Swing, JavaFX & SWT 4
T label überschriebt seine werte-SWT AWT, Swing, JavaFX & SWT 3
O Swing JTree um Label (oder Panel) erweitern AWT, Swing, JavaFX & SWT 9
D Label über JScrollPane AWT, Swing, JavaFX & SWT 3
N Label auf Hauptfenster manipulieren AWT, Swing, JavaFX & SWT 2
S VAADIN: Problem mit Label AWT, Swing, JavaFX & SWT 18
P Ausgabe Label AWT, Swing, JavaFX & SWT 6
GUI-Programmer Informations-Panel an Label AWT, Swing, JavaFX & SWT 2
S ImageIcon von Label entfernen AWT, Swing, JavaFX & SWT 9
B Label breite ermitteln vor dem rendern? AWT, Swing, JavaFX & SWT 7
A Bekomme das Label nicht in die Mitte von Reihe AWT, Swing, JavaFX & SWT 7
H SWT Markierbares Label AWT, Swing, JavaFX & SWT 8
A Swing Box Label ausrichten AWT, Swing, JavaFX & SWT 3
R Label in den Vordergrund einblenden AWT, Swing, JavaFX & SWT 5
J Hintergrund Label-Frame AWT, Swing, JavaFX & SWT 3
O Swing Label(bzw. Grafik) verdekt von anderm Label AWT, Swing, JavaFX & SWT 2
A TextField und Label AWT, Swing, JavaFX & SWT 8
L Label dynamisch awt AWT, Swing, JavaFX & SWT 2
J Label mit transparentem hintergrund - geht das? AWT, Swing, JavaFX & SWT 21
B Die Werte von getLocation() im Label anzeigen AWT, Swing, JavaFX & SWT 4
Avalarion SWT Listener auf Label oder Text Teile AWT, Swing, JavaFX & SWT 10
C Label Hintergrundbild mit Text AWT, Swing, JavaFX & SWT 6
A SWT - Farbe von Text auf Label ändern AWT, Swing, JavaFX & SWT 2
M gridbaglayout - abstand bei label und field AWT, Swing, JavaFX & SWT 8
hdi SWT Label Text vertikal zentrieren AWT, Swing, JavaFX & SWT 6
T In einem Label scrollen AWT, Swing, JavaFX & SWT 3
Spot84 swt label zeilenumbruch will nicht funktionieren AWT, Swing, JavaFX & SWT 1
L JFreeChar Label für StackedBar AWT, Swing, JavaFX & SWT 3
lumo SWT Label - onResize? AWT, Swing, JavaFX & SWT 5
DasDogma AWT Problem bei Wertzuweisung für Label AWT, Swing, JavaFX & SWT 3
A Label hat falsche Position AWT, Swing, JavaFX & SWT 4
O JTable label background und selection AWT, Swing, JavaFX & SWT 3
R Refresh Label AWT, Swing, JavaFX & SWT 4
G SWT Label AWT, Swing, JavaFX & SWT 5
D Label und Transparenz . AWT, Swing, JavaFX & SWT 4
M Scrollbare Label-Liste AWT, Swing, JavaFX & SWT 6
DeeDee0815 SWT Label horizontal und vertikal zentrieren AWT, Swing, JavaFX & SWT 7
I Label sekündlich aktualisieren AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Anzeige

Neue Themen


Oben