1010import javafx .beans .value .ObservableValue ;
1111import javafx .geometry .Insets ;
1212import javafx .geometry .Orientation ;
13+ import javafx .scene .Node ;
1314import javafx .scene .control .Slider ;
15+ import javafx .scene .control .skin .SliderSkin ;
1416import javafx .scene .input .KeyEvent ;
1517import javafx .scene .input .MouseButton ;
1618import javafx .scene .input .MouseEvent ;
3537
3638import java .text .DecimalFormat ;
3739import java .time .Instant ;
40+ import java .util .concurrent .atomic .AtomicBoolean ;
3841import java .util .logging .Level ;
3942
4043import static org .csstudio .display .builder .representation .ToolkitRepresentation .logger ;
@@ -72,6 +75,8 @@ public class ScaledSliderRepresentation extends RegionBaseRepresentation<GridPan
7275 private final Slider slider ;
7376 private final SliderMarkers markers ;
7477
78+ private final AtomicBoolean isHorizontal = new AtomicBoolean (true );
79+
7580 /** Constructor */
7681 public ScaledSliderRepresentation ()
7782 {
@@ -232,6 +237,7 @@ private void orientationChanged(final WidgetProperty<Boolean> prop, final Boolea
232237 model_widget .propWidth ().setValue (h );
233238 model_widget .propHeight ().setValue (w );
234239 }
240+ isHorizontal .set (horizontal );
235241 layoutChanged (prop , old , horizontal );
236242 }
237243
@@ -552,6 +558,8 @@ else if (newval > max)
552558 active = false ;
553559 }
554560 }
561+
562+ adjustSizes ();
555563 jfx_node .layout ();
556564 }
557565
@@ -566,4 +574,32 @@ private void openConfigurationPanel()
566574 else
567575 config_popover .show (slider );
568576 }
577+
578+ /**
579+ * Adjusts knob, track and major tick sizes when widget size increases. Making the widget larger is
580+ * a workaround for visibility issues when the JavaFX native {@link Slider} is rendered on a
581+ * high-resolution monitor.
582+ * <p>
583+ * Applied sizes are based on the height (horizontal) or width (vertical), and
584+ * clamped between the default size and an upper ad-hoc determined limit.
585+ * </p>
586+ */
587+ private void adjustSizes (){
588+ SliderSkin skin = (SliderSkin ) slider .getSkin ();
589+ if (skin != null ) {
590+ double size = isHorizontal .get () ? jfx_node .getHeight () : jfx_node .getWidth ();
591+ for (Node node : skin .getChildren ()) {
592+ if (node .getStyleClass ().contains ("thumb" )) {
593+ // 7.6 seems to be default padding
594+ node .setStyle ("-fx-padding: " + Math .clamp (size * 0.3 , 7.6 , 20 ));
595+ } else if (node .getStyleClass ().contains ("track" )) {
596+ // 3.3 seems to be default padding
597+ node .setStyle ("-fx-padding: " + Math .clamp (size * 0.2 , 3.3 , 13 ));
598+ } else if (node .getStyleClass ().contains ("axis" )) {
599+ // 8 seems to be default major tick length
600+ node .setStyle ("-fx-tick-length: " + Math .clamp (size * 0.1 , 8 , 20 ));
601+ }
602+ }
603+ }
604+ }
569605}
0 commit comments