鼠标进入时更改对象颜色,并在JavaFx出现时将其更改回来

时间:2017-06-11 00:07:32

标签: java javafx

根名为Group,并且已向该组添加了3个子项:来自Rectangle类的正方形,来自Polygon类的三角形和来自Circle类的圆形。这三个对象都是用不同的颜色构建的。

任务:当鼠标位于特定对象上时,请更改该对象的颜色。如果鼠标离开该对象,颜色将会改变。

这就是我的所作所为:

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Polygon;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;


public class ColouredShapes extends Application{
public static void main(String[] args) {
    launch(args);
}

@Override
public void start(Stage primaryStage) {
    Group group = new Group();
    // square
    Rectangle square = new Rectangle(40,40);
    square.setFill(Color.BLUE);
    // triangle
    Polygon triangle = new Polygon();
    triangle.setLayoutX(80);
    triangle.getPoints().addAll(
            40.0,0.0,
            80.0,40.0,
            0.0,40.0
    );
    triangle.setFill(Color.RED);
    //circle
    Circle circle = new Circle(20);
    circle.setLayoutX(240);
    circle.setCenterY(20);

    // ************** where everything happens *****************
    group.onMouseMovedProperty().set(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            System.out.printf("coordinate X: %.2f, coordinate Y: %.2f\n",event.getX(),event.getY());
            System.out.println(event.getSource());

            if (event.getSource() instanceof Rectangle) {
                square.setFill(Color.MAGENTA);
            } else square.setFill(Color.BLUE);
        }
    });


    group.getChildren().add(circle);
    group.getChildren().add(triangle);
    group.getChildren().add(square);

    Scene scene = new Scene(group,700,500);
    primaryStage.setScene(scene);
    primaryStage.show();

} }

问题是event.getSource()返回Group@52d9d54c[styleClass=root]的结果,而不是其子类的结果。因此,无法识别儿童,当鼠标移入该儿童时,颜色不会改变。

1 个答案:

答案 0 :(得分:5)

event.getSource()返回触发事件的节点,在本例中为Group,因为那是您注册处理程序的节点。

在每个单独的节点上使用onMouseEnteredonMouseExited处理程序:

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Polygon;
import javafx.scene.shape.Rectangle;
import javafx.scene.shape.Shape;
import javafx.stage.Stage;

public class ColoredShapes extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        Group group = new Group();
        // square
        Rectangle square = new Rectangle(40, 40);
        square.setFill(Color.BLUE);
        // triangle
        Polygon triangle = new Polygon();
        triangle.setLayoutX(80);
        triangle.getPoints().addAll(40.0, 0.0, 80.0, 40.0, 0.0, 40.0);
        triangle.setFill(Color.RED);
        // circle
        Circle circle = new Circle(20);
        circle.setLayoutX(240);
        circle.setCenterY(20);

        registerHandler(square, Color.BLUE, Color.MAGENTA);
        registerHandler(triangle, Color.RED, Color.MAGENTA);
        registerHandler(circle, Color.BLACK, Color.MAGENTA);

        group.getChildren().add(circle);
        group.getChildren().add(triangle);
        group.getChildren().add(square);

        Scene scene = new Scene(group, 700, 500);
        primaryStage.setScene(scene);
        primaryStage.show();

    }

    private void registerHandler(Shape s, Color defaultColor, Color hoverColor) {
        s.setOnMouseEntered( e -> s.setFill(hoverColor));
        s.setOnMouseExited(e -> s.setFill(defaultColor));
    }

}

您也可以在不使用事件处理程序的情况下执行此操作。使用绑定:

square.fillProperty().bind(Bindings
    .when(square.hoverProperty())
    .then(Color.MAGENTA)
    .otherwise(Color.BLUE));

或使用CSS:

square.getStyleClass().add("square");

然后在外部CSS文件中:

.square {
    -fx-fill: blue ;
}
.square:hover {
    -fx-fill: magenta ;
}