Javafx点击Circle并获得它的参考

时间:2016-03-16 02:57:35

标签: java javafx

我在舞台上有一组节点,圈子。 我希望能够点击其中一个并“选择它”(只需获取它的引用,这样我就可以移动它,改变颜色等。)

    Pane root = new Pane();
    root.getChildren().addAll( /* an array of Circle objects */ );

    Scene scene = new Scene(root, 500, 500, BACKGROUND_COLOR);

    scene.setOnMouseClicked(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent mouseEvent) {
            // how do I get which Circle I clicked on?
        }
    });

    stage.setTitle(TITLE);
    stage.setScene(scene);
    stage.show();

2 个答案:

答案 0 :(得分:1)

您可以使用getSourceMouseEvent来获取参考。

您可以拖动Circle和任何其他节点的示例:

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {

        Circle circle = new Circle( 100,100,50);
        circle.setStroke(Color.BLUE);
        circle.setFill(Color.BLUE.deriveColor(1, 1, 1, 0.3));

        Rectangle rectangle = new Rectangle( 0,0,100,100);
        rectangle.relocate(200, 200);
        rectangle.setStroke(Color.GREEN);
        rectangle.setFill(Color.GREEN.deriveColor(1, 1, 1, 0.3));

        Text text = new Text( "Example Text");
        text.relocate(300, 300);

        Pane root = new Pane();
        root.getChildren().addAll(circle, rectangle, text);

        MouseGestures mouseGestures = new MouseGestures();
        mouseGestures.makeDraggable(circle);
        mouseGestures.makeDraggable(rectangle);
        mouseGestures.makeDraggable(text);

        Scene scene = new Scene(root, 1024, 768);
        primaryStage.setScene(scene);
        primaryStage.show();

    }

    public static class MouseGestures {

        class DragContext {
            double x;
            double y;
        }

        DragContext dragContext = new DragContext();

        public void makeDraggable( Node node) {

            node.setOnMousePressed( onMousePressedEventHandler);
            node.setOnMouseDragged( onMouseDraggedEventHandler);
            node.setOnMouseReleased(onMouseReleasedEventHandler);

        }

        EventHandler<MouseEvent> onMousePressedEventHandler = event -> {

            if( event.getSource() instanceof Circle) {

                Circle circle = (Circle) (event.getSource());

                dragContext.x = circle.getCenterX() - event.getSceneX();
                dragContext.y = circle.getCenterY() - event.getSceneY();

            } else {

                Node node = (Node) (event.getSource());

                dragContext.x = node.getTranslateX() - event.getSceneX();
                dragContext.y = node.getTranslateY() - event.getSceneY();

            }
        };

        EventHandler<MouseEvent> onMouseDraggedEventHandler = event -> {

            if( event.getSource() instanceof Circle) {

                Circle circle = (Circle) (event.getSource());

                circle.setCenterX( dragContext.x + event.getSceneX());
                circle.setCenterY( dragContext.y + event.getSceneY());

            } else {

                Node node = (Node) (event.getSource());

                node.setTranslateX( dragContext.x + event.getSceneX());
                node.setTranslateY( dragContext.y + event.getSceneY());

            }

        };

        EventHandler<MouseEvent> onMouseReleasedEventHandler = event -> {
        };

    }


    public static void main(String[] args) {
        launch(args);
    }
}

答案 1 :(得分:1)

我只想在每个圈子中注册一个听众。然后,您已经获得了监听者注册的圈子的引用。

这个例子略微提高了可用性,因为它一次显示了10,000个圆圈,但它演示了这个技术:

.intersection {
    -fx-fill: blue ;
}
.intersection:selected {
    -fx-fill: gold ;
}

使用文件grid.css:

M