java - showoptiondialog - Cómo verificar si el nodo rectangular está en la ventana
metodo list java (1)
Hasta ahora he codificado una aplicación JavaFX en la que algunos rectángulos se mueven. Ahora quiero crear un método para verificar si un rectángulo todavía está visible en la ventana o si ya se movió fuera de él. Mi código se ve así:
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);
}
}
El método outOfWindow()
es mi intento de verificar si la posición del rectángulo todavía está en la ventana. Funciona. Pero, ¿hay una forma mejor o una forma de detectar qué borde de ventana cruzó el rectángulo?
Si un rectángulo está fuera del otro, significa dos cosas:
- ellos no se cruzan
- el más grande no contiene completamente el más pequeño
Entonces su método puede verse de la siguiente manera:
private boolean inTheWindow(Rectangle rect) {
return rect.getBoundsInParent().intersects(root.getLayoutBounds())
|| root.getLayoutBounds().contains(rect.getBoundsInParent());
}
Aquí está MCVE para demostrar:
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());
}
}