How do I use sliders to change RGB values?

565 views Asked by At

I'm trying to write a program that uses sliders to change the RGB values of a rectangle's color. I started trying with listeners, but as soon as I try to change a different slider, it resets to color so I don't know if listeners are the best option.

Here is the relevant portion of my code:

        redSlider.valueProperty().addListener((ObservableValue<? extends Number>
                ov, Number old_val, Number new_val) -> {
            double redLevel1 = 0;
            redLevel1 = (double) new_val;
            Color c1 = Color.rgb((int) redLevel1, 0, 0);
            rectangle.setFill(c1);
        });
        greenSlider.valueProperty().addListener((ObservableValue<? extends Number>
                ov, Number old_val, Number new_val) -> {
            double greenLevel = 0;
            greenLevel = (double) new_val;
            Color c1 = Color.rgb(0, (int) greenLevel, 0);
            rectangle.setFill(c1);
        });
        blueSlider.valueProperty().addListener((ObservableValue<? extends Number>
                ov, Number old_val, Number new_val) -> {
            double blueLevel = 0;
            blueLevel = (double) new_val;
            Color c1 = Color.rgb(0, 0, (int) blueLevel);
            rectangle.setFill(c1);
        });

EDIT: I ended up using a ChangeListener to get it working. Here is the code I used:

        redSlider.valueProperty().addListener(new ChangeListener<Number>() {
            public void changed(ObservableValue<? extends Number> ov, Number
                    old_val, Number new_val) {
                rectangle.setFill(Color.rgb((int) redSlider.getValue(), 
                        (int) greenSlider.getValue(), 
                        (int) blueSlider.getValue()));
            }
        });
        greenSlider.valueProperty().addListener(new ChangeListener<Number>() {
            public void changed(ObservableValue<? extends Number> ov, Number
                    old_val, Number new_val) {
                rectangle.setFill(Color.rgb((int) redSlider.getValue(), 
                        (int) greenSlider.getValue(), 
                        (int) blueSlider.getValue()));
            }
        });
        blueSlider.valueProperty().addListener(new ChangeListener<Number>() {
            public void changed(ObservableValue<? extends Number> ov, Number
                    old_val, Number new_val) {
                rectangle.setFill(Color.rgb((int) redSlider.getValue(), 
                        (int) greenSlider.getValue(), 
                        (int) blueSlider.getValue()));
            }
        });
1

There are 1 answers

0
DaveB On

I prefer to use bindings instead of ChangeListeners for stuff like this. The following class will demonstrate the desired action:

    public class SliderBind extends VBox {

    public SliderBind() {
        Slider redSlider = new Slider(0, 1.0, 0.5);
        Slider greenSlider = new Slider(0, 1.0, 0.5);
        Slider blueSlider = new Slider(0, 1.0, 0.5);
        Rectangle rectangle = new Rectangle(100,100);
        getChildren().addAll(rectangle, redSlider, greenSlider, blueSlider);
        rectangle.fillProperty().bind(Bindings.createObjectBinding(() -> new Color(redSlider.getValue(),
                greenSlider.getValue(), blueSlider.getValue(), 1.0), redSlider.valueProperty(),
                greenSlider.valueProperty(),blueSlider.valueProperty()));
    }
}

Use the following main() to run it:

public class Sample1 extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        Scene scene = new Scene(new SliderBind(), 200, 300);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}