diff --git a/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/ScaledSliderRepresentation.java b/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/ScaledSliderRepresentation.java
index 3faac081b5..63d8b9e9b4 100644
--- a/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/ScaledSliderRepresentation.java
+++ b/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/ScaledSliderRepresentation.java
@@ -7,10 +7,12 @@
*******************************************************************************/
package org.csstudio.display.builder.representation.javafx.widgets;
+import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.geometry.Insets;
import javafx.geometry.Orientation;
import javafx.scene.Node;
+import javafx.scene.control.Skin;
import javafx.scene.control.Slider;
import javafx.scene.control.skin.SliderSkin;
import javafx.scene.input.KeyEvent;
@@ -37,7 +39,6 @@
import java.text.DecimalFormat;
import java.time.Instant;
-import java.util.concurrent.atomic.AtomicBoolean;
import java.util.logging.Level;
import static org.csstudio.display.builder.representation.ToolkitRepresentation.logger;
@@ -75,14 +76,12 @@ public class ScaledSliderRepresentation extends RegionBaseRepresentation prop, final Boolea
model_widget.propWidth().setValue(h);
model_widget.propHeight().setValue(w);
}
- isHorizontal.set(horizontal);
layoutChanged(prop, old, horizontal);
}
@@ -534,6 +535,8 @@ public void updateChanges()
if (any_markers)
markers.setAlarmMarkers(lolo, low, high, hihi);
+
+ adjustSizes();
}
if (dirty_value.checkAndClear())
{
@@ -569,7 +572,6 @@ else if (newval > max)
}
}
- adjustSizes();
jfx_node.layout();
}
@@ -595,24 +597,40 @@ private void openConfigurationPanel()
*
*/
private void adjustSizes(){
- SliderSkin skin = (SliderSkin) slider.getSkin();
- if (skin == null) {
+
+ Skin> skin = slider.getSkin();
+ if(skin == null){
return;
}
- double size = isHorizontal.get() ? jfx_node.getHeight() : jfx_node.getWidth();
- for (Node node : skin.getChildren()) {
+
+ double size = model_widget.propHorizontal().getValue() ?
+ jfx_node.getHeight() :
+ jfx_node.getWidth();
+
+ for (Node node : ((SliderSkin) skin).getChildren()) {
if (node.getStyleClass().contains("thumb")) {
node.setStyle("-fx-padding: " + Math.clamp(size * THUMB_SCALING_FACTOR,
- THUMB_PADDING_DEFAULT,
- THUMB_PADDING_MAX));
+ THUMB_PADDING_DEFAULT, THUMB_PADDING_MAX));
} else if (node.getStyleClass().contains("track")) {
node.setStyle("-fx-padding: " + Math.clamp(size * TRACK_SCALING_FACTOR,
- TRACK_PADDING_DEFAULT,
- TRACK_PADDING_MAX));
+ TRACK_PADDING_DEFAULT, TRACK_PADDING_MAX));
} else if (node.getStyleClass().contains("axis")) {
node.setStyle("-fx-tick-length: " + Math.clamp(size * MAJOR_TICK_LENGTH_SCALING_FACTOR,
- MAJOR_TICK_LENGTH_DEFAULT,
- MAJOR_TICK_LENGTH_MAX));
+ MAJOR_TICK_LENGTH_DEFAULT, MAJOR_TICK_LENGTH_MAX));
+ }
+ }
+ }
+
+ /**
+ * Custom {@link ChangeListener} for the purpose of setting slider sizes once there is a {@link Skin}
+ * available to manipulate.
+ */
+ private class SkinChangeListener implements ChangeListener>{
+ @Override
+ public void changed(ObservableValue extends Skin>> observableValue, Skin> oldValue, Skin> newValue) {
+ if(oldValue == null && newValue != null){
+ adjustSizes();
+ slider.skinProperty().removeListener(this);
}
}
}