着色JavaFX形状

时间:2016-04-17 16:47:04

标签: 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();
    }

}

我不太确定我错过了什么或做错了什么?

1 个答案:

答案 0 :(得分:0)

每当您选择一个形状时,该形状就会设置为selectedRectangle = (Rectangle) 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中的if (selectedRectangle != null && selectedCircle == null) {为空(selectedRectangle = (Rectangle) g.getTarget(); selectedCircle = null;

此外,您需要确保在选择新形状时将其他形状设置为null:

static int[] unpackARGB(int argb){
    return new int[] { (argb >> 16) & 0xff, (argb >> 8) & 0xff, argb & 0xff };
}

static int packARGB(int[] ints){
    return (0xff << 24 + ints[0] & 0xff) << 16 + (ints[1] & 0xff) << 8 + ints[2] & 0xff;
}

,反之亦然。