Javafx:在移动过程中保持一个数字在场景中

时间:2016-12-16 17:02:30

标签: java javafx

首先,我刚刚开始使用JavaFX和Java,所以要耐心等待我:)我想知道如何保持形状,在我的情况下是一个圆形,在JavaFX期间被限制在场景中移动?

这是我的Circle课程

public class NewCircle extends Circle {

public NewCircle (double x, double y , double radius, Color colore){
    super(x,y,radius);
    this.setFill(colore);
    this.setOnMousePressed(circleOnMousePressedEventHandler);
    this.setOnMouseDragged(circleOnMouseDraggedEventHandler);
}

double orgSceneX, orgSceneY;
double orgTranslateX, orgTranslateY;
double centerX = this.getCenterX();
double centerY = this.getCenterY();
double radius = this.getRadius();


EventHandler<MouseEvent> circleOnMousePressedEventHandler = new EventHandler<MouseEvent>(){
    @Override 
    public void handle(MouseEvent t){
        orgSceneX = t.getSceneX();
        orgSceneY = t.getSceneY();
        orgTranslateX = ((Circle) (t.getSource())).getTranslateX();
        orgTranslateY = ((Circle) (t.getSource())).getTranslateY();         
    }
};

EventHandler<MouseEvent> circleOnMouseDraggedEventHandler = 
    new EventHandler<MouseEvent>() {

    @Override
    public void handle(MouseEvent t) {
        double offsetX = t.getSceneX() - orgSceneX;
        double offsetY = t.getSceneY() - orgSceneY;
        double newTranslateX = orgTranslateX + offsetX;
        double newTranslateY = orgTranslateY + offsetY;          
        ((Circle)(t.getSource())).setTranslateX(newTranslateX);
        ((Circle)(t.getSource())).setTranslateY(newTranslateY);
        }
    };  
}

1 个答案:

答案 0 :(得分:0)

确保拖动节点的任何边界都不跨越场景边界:

double orgSceneX, orgSceneY;
double orgTranslateX, orgTranslateY;
EventHandler<MouseEvent> circleOnMousePressedEventHandler = new EventHandler<MouseEvent>() {
    @Override
    public void handle(MouseEvent t) {
        orgSceneX = t.getSceneX();
        orgSceneY = t.getSceneY();
        Node source = (Node) t.getSource();
        orgTranslateX = source.getTranslateX();
        orgTranslateY = source.getTranslateY();
    }
};

EventHandler<MouseEvent> circleOnMouseDraggedEventHandler
        = new EventHandler<MouseEvent>() {

            @Override
            public void handle(MouseEvent t) {
                Node source = (Node) t.getSource();

                Bounds sceneBounds = source.getScene().getRoot().getLayoutBounds();
                Bounds localBounds = source.getBoundsInLocal();

                double offsetX = t.getSceneX() - orgSceneX;
                double offsetY = t.getSceneY() - orgSceneY;

                double newTranslateX = orgTranslateX + offsetX;
                double newTranslateY = orgTranslateY + offsetY;

                // restirct x movement to scene bounds
                if (offsetX >= 0) {
                    if (localBounds.getMaxX() + newTranslateX > sceneBounds.getMaxX()) {
                        newTranslateX = sceneBounds.getMaxX() - localBounds.getMaxX();
                    }
                } else {
                    if (localBounds.getMinX() + newTranslateX < 0) {
                        newTranslateX = -localBounds.getMinX();
                    }
                }

                // restrict y movement to scene bounds
                if (offsetY >= 0) {
                    if (localBounds.getMaxY() + newTranslateY > sceneBounds.getMaxY()) {
                        newTranslateY = sceneBounds.getMaxY() - localBounds.getMaxY();
                    }
                } else {
                    if (localBounds.getMinY() + newTranslateY < 0) {
                        newTranslateY = -localBounds.getMinY();
                    }
                }

                source.setTranslateX(newTranslateX);
                source.setTranslateY(newTranslateY);
            }
        };

@Override
public void start(Stage primaryStage) {
    Circle circle = new Circle(100, 100, 50);
    circle.setOnMousePressed(circleOnMousePressedEventHandler);
    circle.setOnMouseDragged(circleOnMouseDraggedEventHandler);

    Pane root = new Pane(circle);

    Scene scene = new Scene(root, 400, 400);

    primaryStage.setScene(scene);
    primaryStage.show();
}