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 7217bdc386..9d61e89e8c 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 @@ -10,7 +10,9 @@ import javafx.beans.value.ObservableValue; import javafx.geometry.Insets; import javafx.geometry.Orientation; +import javafx.scene.Node; import javafx.scene.control.Slider; +import javafx.scene.control.skin.SliderSkin; import javafx.scene.input.KeyEvent; import javafx.scene.input.MouseButton; import javafx.scene.input.MouseEvent; @@ -35,6 +37,7 @@ 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; @@ -72,6 +75,8 @@ 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); } @@ -552,6 +558,8 @@ else if (newval > max) active = false; } } + + adjustSizes(); jfx_node.layout(); } @@ -566,4 +574,32 @@ private void openConfigurationPanel() else config_popover.show(slider); } + + /** + * Adjusts knob, track and major tick sizes when widget size increases. Making the widget larger is + * a workaround for visibility issues when the JavaFX native {@link Slider} is rendered on a + * high-resolution monitor. + *

+ * Applied sizes are based on the height (horizontal) or width (vertical), and + * clamped between the default size and an upper ad-hoc determined limit. + *

+ */ + private void adjustSizes(){ + SliderSkin skin = (SliderSkin) slider.getSkin(); + if (skin != null) { + double size = isHorizontal.get() ? jfx_node.getHeight() : jfx_node.getWidth(); + for (Node node : skin.getChildren()) { + if (node.getStyleClass().contains("thumb")) { + // 7.6 seems to be default padding + node.setStyle("-fx-padding: " + Math.clamp(size * 0.3, 7.6, 20)); + } else if (node.getStyleClass().contains("track")) { + // 3.3 seems to be default padding + node.setStyle("-fx-padding: " + Math.clamp(size * 0.2, 3.3, 13)); + } else if (node.getStyleClass().contains("axis")) { + // 8 seems to be default major tick length + node.setStyle("-fx-tick-length: " + Math.clamp(size * 0.1, 8, 20)); + } + } + } + } } \ No newline at end of file