【问题标题】:How to keep a movable object inside the window with JavaFX?如何使用 JavaFX 将可移动对象保留在窗口内?
【发布时间】:2020-01-08 21:30:42
【问题描述】:

我有一个圆圈和四个按钮来移动它;上 (ylos)、下 (alas)、左 (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);
}

}

【问题讨论】:

    标签: javafx shapes


    【解决方案1】:

    问题是 ympyra.getCenterX()ympyra.getCenterY() 在这种情况下将始终返回 0。您必须检查 parent 中的边界以了解圆圈是否“超出”窗口。

    这应该做的工作

    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(窗口和圆之间小于 10px),如果不可以,则根据圆的位置和父级的边界计算平移

    【讨论】:

      猜你喜欢
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      • 2012-10-23
      • 2018-12-15
      • 1970-01-01
      • 1970-01-01
      • 2019-01-07
      相关资源
      最近更新 更多