Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make JavaFX Slider to move in discrete steps?

I am making a GUI using JavaFx and I need sliders that only allow integers to ever be selected.

I know I can use snapToTicks, but while pulling the "knob", it can still represent a non-integer value. I would like to get rid of that. It messes up other components linked to it.

Basically, I want something like Swing's JSlider, but with JavaFx. Is it possible? I have been searching but I can't find anything.

like image 831
Mr Redstoner Avatar asked Jul 31 '16 07:07

Mr Redstoner


2 Answers

You can simply add a listener to the valueProperty of the Slider and then you can either set the integer value of the new Number value:

slider.valueProperty().addListener((obs, oldval, newVal) -> 
    slider.setValue(newVal.intValue()));

or alternatively you can use integer rounding using Math.round:

slider.valueProperty().addListener((obs, oldval, newVal) ->
    slider.setValue(Math.round(newVal.doubleValue())));
like image 180
DVarga Avatar answered Nov 07 '22 14:11

DVarga


In FXML:

<Slider fx:id="availableReproSelector" 
        blockIncrement="1.0" 
        cache="true" 
        majorTickUnit="1.0" 
        max="4.0" 
        min="1.0" 
        minorTickCount="0" 
        showTickLabels="true" 
        showTickMarks="true" 
        snapToTicks="true" 
        value="1.0" 
        />

Or in Java:

Slider slider = new Slider(1, 4, 1);
slider.setBlockIncrement(1);
slider.setMajorTickUnit(1);
slider.setMinorTickCount(0);
slider.setShowTickLabels(true);
slider.setSnapToTicks(true);

The key here is the snap to ticks option combined with a proper combination of tick units. This setting results in the following slider which can only be used to select values ranging from 1 to 4 :

can only select int values ranging from 1 to 4

like image 13
Arthur Vaïsse Avatar answered Nov 07 '22 14:11

Arthur Vaïsse