Как сохранить подвижный объект внутри окна с помощью JavaFX? - PullRequest
0 голосов
/ 09 января 2020

У меня есть круг и четыре кнопки для его перемещения; вверх (ylos), вниз (увы), влево (vasemmalle) и вправо (oikealle). Естественно, я хотел бы сохранить свой круг внутри окна, но как только я добавляю к событию кнопки условие, которое препятствует движению круга за пределы окна, оно перестает полностью двигаться в этом направлении.

Радиус круга равен 100, он начинается с середины (?), Что означает координаты (200,200).

Ниже приведен мой код, я уверен, что некоторые из вас легко заметят мой ошибка из такой простой программы. Я поставил предполагаемое профилактическое условие только на одну кнопку, чтобы вы могли видеть, что другие работают так, как должны. Строка прокомментирована.

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.*;
import javafx.scene.shape.Circle;
import javafx.scene.paint.Color;
import javafx.scene.control.Button;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.collections.ObservableList;

public class Ympyra extends Application {

private double uusiY, uusiX, raja = 0;

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

    Circle ympyra = new Circle(100);
    ympyra.setStroke(Color.BLACK);
    ympyra.setFill(Color.WHITE);

    Button btnYlos = new Button("Ylos");
    Button btnAlas = new Button("Alas");
    Button btnOikea = new Button("Oikealle");
    Button btnVasen = new Button("Vasemmalle");

    btnYlos.setOnMouseClicked(e -> {
        uusiY = ympyra.getCenterY() + uusiY - 10;
        if (uusiY < 100) { uusiY += 10; } // for example this kind of condition stops upward movement completely
        ympyra.setTranslateX(uusiX);
        ympyra.setTranslateY(uusiY);
    });
    btnAlas.setOnMouseClicked(e -> {
        uusiY = ympyra.getCenterY() + uusiY + 10;
        ympyra.setTranslateX(uusiX);
        ympyra.setTranslateY(uusiY);
    });
    btnOikea.setOnMouseClicked(e -> {
        uusiX = ympyra.getCenterX() + uusiX + 10;
        ympyra.setTranslateX(uusiX);
        ympyra.setTranslateY(uusiY);
    });
    btnVasen.setOnMouseClicked(e -> {
        uusiX = ympyra.getCenterX() + uusiX - 10;
        ympyra.setTranslateX(uusiX);
        ympyra.setTranslateY(uusiY);
    });

    HBox napit = new HBox();
    napit.setAlignment(Pos.CENTER);
    napit.setSpacing(20);
    napit.setMargin(btnYlos, new Insets(5, 5, 5, 5));
    napit.setMargin(btnAlas, new Insets(5, 5, 5, 5));
    napit.setMargin(btnOikea, new Insets(5, 5, 5, 5));
    napit.setMargin(btnVasen, new Insets(5, 5, 5, 5));
    ObservableList lista = napit.getChildren();
    lista.addAll(btnYlos, btnAlas, btnOikea, btnVasen);

    BorderPane paneeli = new BorderPane();
    paneeli.setCenter(ympyra);
    paneeli.setBottom(napit);

    Scene kehys = new Scene(paneeli, 400, 400);
    aloitus.setTitle("Ympyra");
    aloitus.setScene(kehys);
    aloitus.show();

}

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

}

1 Ответ

2 голосов
/ 09 января 2020

Проблема ympyra.getCenterX() и ympyra.getCenterY() всегда будет возвращать 0 в этом случае. Вы должны проверить границы родительского элемента, чтобы узнать, находится ли круг «вне» окна или нет.

Это должно сработать

btnYlos.setOnMouseClicked(e -> {
    uusiY -= ympyra.getBoundsInParent().getMinY() - 10 < 0 ? ympyra.getBoundsInParent().getMinY() : 10;
    ympyra.setTranslateY(uusiY);
});
btnAlas.setOnMouseClicked(e -> {
    uusiY += ympyra.getBoundsInParent().getMaxY() + 10 > ympyra.getParent().getLayoutBounds().getMaxY()
            ? ympyra.getParent().getLayoutBounds().getMaxY() - ympyra.getBoundsInParent().getMaxY() : 10;
    ympyra.setTranslateY(uusiY);
});
btnOikea.setOnMouseClicked(e -> {
    uusiX += ympyra.getBoundsInParent().getMaxX() + 10 > ympyra.getParent().getLayoutBounds().getMaxX()
            ? ympyra.getParent().getLayoutBounds().getMaxX() - ympyra.getBoundsInParent().getMaxX() : 10;
    ympyra.setTranslateX(uusiX);
});
btnVasen.setOnMouseClicked(e -> {
    uusiX -= ympyra.getBoundsInParent().getMinX() - 10 < 0 ? ympyra.getBoundsInParent().getMinX() : 10;
    ympyra.setTranslateX(uusiX);
});

Для каждого случая будет проверяться если возможен перевод 10 (менее 10 пикселей между окном и кругом), если нет, перевод рассчитывается на основе положения круга и границ родителя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...