【发布时间】: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) -> {Color color = Color.rgb((int) redSlider.getValue(), (int) greenSlider.getValue(), (int) blueSlider.getValue()); ... }是一个无效监听器,它与用于所有 3 个滑块的实现具有相同的效果。
标签: javafx colors slider javafx-2 rgb