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> observableValue, Skin oldValue, Skin newValue) { + if(oldValue == null && newValue != null){ + adjustSizes(); + slider.skinProperty().removeListener(this); } } }