如何使用滑块更改RGB值?

时间:2020-04-09 22:04:28

标签: javafx colors slider javafx-2 rgb

我正在尝试编写一个使用滑块更改矩形颜色的RGB值的程序。我开始尝试使用监听器,但是当我尝试更改其他滑块时,它会重置为彩色,因此我不知道监听器是否是最佳选择。

这是我代码的相关部分:

        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);
        });

编辑:我最终使用ChangeListener使其正常工作。 这是我使用的代码:

        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 个答案:

答案 0 :(得分:0)

对于这样的事情,我更喜欢使用绑定而不是 ChangeListeners。以下课程将演示所需的操作:

    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()));
    }
}

使用以下 main() 来运行它:

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();
    }
}