着色JavaFX形状
我有一个场景图,它包含两个按钮,一个用于创建矩形,一个用于创建圆,还有一个滑块,当移动它时,将改变形状对象的颜色。这些形状也可以拖动。不幸的是,颜色滑块不是我想要的那样工作。其想法是,一旦通过按钮创建了形状,并用鼠标单击该形状,形状的颜色将根据拖动滑块的位置而变化(唯一的颜色是红色) 问题是,我不能独立地着色和重新着色我想要的形状-如果先创建矩形,然后创建圆形,我可以着色矩形,但不能着色圆形。如果我先创建圆圈,然后创建矩形,我可以先给圆圈上色,然后再给矩形上色,但是在再次选择圆圈后,无法给它上色着色JavaFX形状,java,javafx-8,Java,Javafx 8,我有一个场景图,它包含两个按钮,一个用于创建矩形,一个用于创建圆,还有一个滑块,当移动它时,将改变形状对象的颜色。这些形状也可以拖动。不幸的是,颜色滑块不是我想要的那样工作。其想法是,一旦通过按钮创建了形状,并用鼠标单击该形状,形状的颜色将根据拖动滑块的位置而变化(唯一的颜色是红色) 问题是,我不能独立地着色和重新着色我想要的形状-如果先创建矩形,然后创建圆形,我可以着色矩形,但不能着色圆形。如果我先创建圆圈,然后创建矩形,我可以先给圆圈上色,然后再给矩形上色,但是在再次选择圆圈后,无法给它上色
import javafx.application.Application;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Slider;
import javafx.stage.Stage;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
public class SquareRectangle extends Application
{
private Rectangle selectedRectangle;
private Circle selectedCircle;
private int red = 255;
private int green = 0;
private int blue = 0;
public static void main(String [] args)
{
launch(args);
}
public void start(Stage primaryStage)
{
Pane root = new Pane();
Scene scene = new Scene(root,800,800);
Button Rectangles = new Button("Rectangles");
Button Circles = new Button("Circles");
Slider ColorSlider = new Slider(0,255,0);
Circles.setLayoutX(90);
ColorSlider.setLayoutY(70);
Rectangles.setOnAction(e ->{
Rectangle rect = new Rectangle();
rect.setLayoutX(1080/2);
rect.setLayoutY(400);
rect.setOnMouseDragged(f ->{
rect.setX(f.getX());
rect.setY(f.getY());
});
rect.setOnMousePressed(g ->{
selectedRectangle = (Rectangle) g.getTarget();
});
root.getChildren().add(rect);
rect.setHeight(100);
rect.setWidth(200);
});
Circles.setOnAction( e ->{
Circle circle = new Circle(300,300,100);
circle.setLayoutX(200);
circle.setLayoutY(200);
circle.setOnMouseDragged(f ->{
circle.setCenterX(f.getX());
circle.setCenterY(f.getY());
});
circle.setOnMousePressed(g ->{
selectedCircle = (Circle) g.getTarget();
});
root.getChildren().add(circle);
});
ColorSlider.valueProperty().addListener(
(ObservableValue<? extends Number> ov,Number curVal, Number newVal)->{
if(selectedRectangle != null){
red = (int) ColorSlider.getValue();
selectedRectangle.setFill(Color.rgb(red,green,blue));
}
else if(selectedCircle != null && selectedRectangle == null){
red = (int) ColorSlider.getValue();
selectedCircle.setFill(Color.rgb(red,green,blue));
}
});
root.getChildren().addAll(Rectangles,Circles,ColorSlider);
primaryStage.setTitle("Shapes");
primaryStage.setScene(scene);
primaryStage.show();
}
}
导入javafx.application.application;
导入javafx.beans.value.observeValue;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.control.Slider;
导入javafx.stage.stage;
导入javafx.scene.layout.Pane;
导入javafx.scene.paint.Color;
导入javafx.scene.shape.Circle;
导入javafx.scene.shape.Rectangle;
公共类SquareRectangle扩展了应用程序
{
私有矩形selectedRectangle;
私人圈子选择圈子;
私有整数红色=255;
私有整数绿色=0;
私有int蓝色=0;
公共静态void main(字符串[]args)
{
发射(args);
}
公共无效开始(阶段primaryStage)
{
窗格根=新窗格();
场景=新场景(根,800800);
按钮矩形=新按钮(“矩形”);
按钮圆圈=新按钮(“圆圈”);
滑块颜色滑块=新滑块(0255,0);
圆。setLayoutX(90);
颜色滑块。设置布局(70);
矩形。设置动作(e->{
矩形rect=新矩形();
矩形setLayoutX(1080/2);
直视布局(400);
rect.setonMouseDrawed(f->{
rect.setX(f.getX());
setY(f.getY());
});
矩形设置鼠标按下(g->{
selectedRectangle=(矩形)g.getTarget();
});
root.getChildren().add(rect);
直线设置高度(100);
直线设置宽度(200);
});
圆。设置动作(e->{
圆圈=新圆圈(300100);
圆。setLayoutX(200);
圆。setLayoutY(200);
circle.setonMouseDrawed(f->{
circle.setCenterX(f.getX());
圆.setCenterY(f.getY());
});
圆圈。设置鼠标按下(g->{
selectedCircle=(Circle)g.getTarget();
});
root.getChildren().add(圆);
});
ColorSlider.valueProperty().addListener(
(ObservableValue每当您选择一个形状时,该形状就会设置为selectedRectangle=(矩形)g.getTarget();
,或selectedCircle=(Circle)g.getTarget();
在更改颜色的代码中,它将始终检查矩形是否为空:
if (selectedRectangle != null) {
red = (int) ColorSlider.getValue();
selectedRectangle.setFill(Color.rgb(red, green, blue));
} else if (selectedCircle != null && selectedRectangle == null) {
red = (int) ColorSlider.getValue();
selectedCircle.setFill(Color.rgb(red, green, blue));
}
使用上面的代码,确保selectedCircle
在第一条语句中为null(if(selectedlectangle!=null&&selectedCircle==null){
)
此外,您还需要确保在选择新形状时将另一个形状设置为null:
selectedRectangle = (Rectangle) g.getTarget();
selectedCircle = null;
反之亦然。谢谢!我尝试了一些方法,但都没有达到目的。帮了大忙