【问题标题】:How do I use sliders to change RGB values?如何使用滑块更改 RGB 值?
【发布时间】:2020-07-22 15:39:05
【问题描述】:

我正在尝试编写一个程序,该程序使用滑块来更改矩形颜色的 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()));
            }
        });

【问题讨论】:

  • 改变一个滑块值并不意味着所有其他分量突然变为0。在确定新颜色时需要考虑所有滑块值。注册到 3 个属性的单个 InvalidationListener 实际上就足够了,因为无论更改哪个值,您都需要创建一个新的 Color 对象。根据滑块值范围,计算实际上可能是不正确的......旁注:为什么要使用值初始化局部变量,如果您立即覆盖它而不读取初始值?
  • ChangeListener 在这种情况下也可以工作吗?
  • 是的,但是要么你不能重用相同的实现,要么你只是忽略完全传递的参数(o) -&gt; {Color color = Color.rgb((int) redSlider.getValue(), (int) greenSlider.getValue(), (int) blueSlider.getValue()); ... } 是一个无效监听器,它与用于所有 3 个滑块的实现具有相同的效果。

标签: javafx colors slider javafx-2 rgb


【解决方案1】:

我更喜欢使用绑定而不是 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();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多