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