着色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;

反之亦然。

谢谢!我尝试了一些方法,但都没有达到目的。帮了大忙