如何检查矩形节点是否在窗口中

时间:2017-07-01 12:48:54

标签: java javafx

到目前为止,我编写了一个JavaFX应用程序,其中一些矩形移动。现在我想创建一个方法来检查矩形是否仍然在窗口中可见或已经移出它。我的代码看起来像这样:

import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.geometry.Point2D;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class Test extends Application {
    private Pane root = new Pane();
    private Rectangle rect = new Rectangle(150,150,15,15);
    private Point2D velocity = new Point2D(2,1);

    private Pane createContent(){
        root.setPrefSize(500,500);
        root.getChildren().add(rect);

        AnimationTimer timer = new AnimationTimer() {
            @Override
            public void handle(long now) {
                update();
            }
        };
        timer.start();

        return root;
    }

    private void update(){
        if (outOfWindow(rect)) {
            System.out.println("out of window...\n");

        }else {
            System.out.println("in window...\n");
        }

        rect.setTranslateX(rect.getTranslateX() + velocity.getX());
        rect.setTranslateY(rect.getTranslateY() + velocity.getY());
    }

    private boolean outOfWindow(Node node) {
        if (node.getBoundsInParent().intersects(node.getBoundsInParent().getWidth(), node.getBoundsInParent().getHeight(),
            root.getPrefWidth() - node.getBoundsInParent().getWidth() * 2,
            root.getPrefHeight() - node.getBoundsInParent().getHeight() * 2)){
            return false;
        }
        return true;
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setScene(new Scene(createContent()));
        primaryStage.show();
    }

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

outOfWindow()方法试图检查矩形的位置是否仍在窗口中。有用。但有没有更好的方法或方法来检测矩形交叉的窗口边界?

1 个答案:

答案 0 :(得分:2)

如果一个矩形在另一个矩形之外,则意味着两件事:

  • 他们不相交
  • 较大的一个不完全包含较小的一个

所以你的方法可以看下一个方式:

private boolean inTheWindow(Rectangle rect) {
    return rect.getBoundsInParent().intersects(root.getLayoutBounds()) 
        || root.getLayoutBounds().contains(rect.getBoundsInParent());
}

以下是MCVE来演示:

public class FXBounds extends Application {

    private Pane root;

    @Override
    public void start(Stage primaryStage) {

        root = new Pane();

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();

        check(1,1,50,50, true);
        check(100,100,50,50, true);
        check(-5,-5,30,30, true);
        check(-50,0,30,30, false);
    }

    private void check(int x, int y, int width, int height, boolean in) {
        Rectangle rect = new Rectangle(x, y, width, height);
        root.getChildren().add(rect);
        System.out.println(in == inTheWindow(rect));
    }

    private boolean inTheWindow(Rectangle rect) {
        return rect.getBoundsInParent().intersects(root.getLayoutBounds()) || root.getLayoutBounds().contains(rect.getBoundsInParent());
    }
}