如何使用 JavaFX 将可移动对象保留在 window 内?
How to keep a movable object inside the window with JavaFX?
我有一个圆圈和四个用于移动它的按钮;向上 (ylos)、向下 (alas)、向左 (vasemmalle) 和向右 (oikealle)。当然,我想将我的圆圈保持在 window 内,但是一旦我向按钮事件添加一个条件以防止圆圈移动到 window 之外,它就会完全停止向该方向移动。
圆的半径为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);
}
}
问题是 ympyra.getCenterX()
并且 ympyra.getCenterY()
在这种情况下总是 return 0。您必须检查父级的边界才能知道圆圈是否是 window 的 "out"。
这应该可以完成工作
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(window 和圆圈之间的距离小于 10px),如果不行,则根据圆圈位置和父边界计算平移
我有一个圆圈和四个用于移动它的按钮;向上 (ylos)、向下 (alas)、向左 (vasemmalle) 和向右 (oikealle)。当然,我想将我的圆圈保持在 window 内,但是一旦我向按钮事件添加一个条件以防止圆圈移动到 window 之外,它就会完全停止向该方向移动。
圆的半径为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);
}
}
问题是 ympyra.getCenterX()
并且 ympyra.getCenterY()
在这种情况下总是 return 0。您必须检查父级的边界才能知道圆圈是否是 window 的 "out"。
这应该可以完成工作
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(window 和圆圈之间的距离小于 10px),如果不行,则根据圆圈位置和父边界计算平移