自定义对象的JavaFX布局

时间:2016-11-12 14:42:28

标签: animation layout javafx

第一次使用JavaFX,所以我对setLayout() / getLayout()方法有疑问。我正在建立一个弹跳球项目。首先我使用Circle对象来创建球,但由于我需要传递更多参数,所以我决定构建自己的Ball类(double x, double y, double dx, double dy, double size)。这是我之前使用Circle时的代码:

ball.setLayoutX(ball.getLayoutX() + dx);
ball.setLayoutY(ball.getLayoutY() + dy);

final Bounds bounds = canvas.getBoundsInLocal();
boolean right = ball.getLayoutX() >= (bounds.getMaxX() - ball.getRadius());
boolean left = ball.getLayoutX() <= (bounds.getMinX() + ball.getRadius());
boolean bottom = ball.getLayoutY() >= (bounds.getMaxY() - ball.getRadius());
boolean top = ball.getLayoutY() <= (bounds.getMinY() + ball.getRadius());

if (right || left) {
    dx *= -1;
}
if (bottom || top) {
    dy *= -1;
}

这得到了Circle&#34;球&#34;当TimelineKeyFrameEventHandler放在一起时,会在墙壁上反弹。现在我试图弄清楚如何使用Ball球,因为使用我自己的方法getLayout()setLayout()getRadius()无法解决宾语。我如何解决这个问题/建立我自己的setLayout()等?

1 个答案:

答案 0 :(得分:0)

将所有逻辑放在Ball班级中:

public class Ball {

    private final Circle view ;

    private double dx ;
    private double dy ;

    public Ball(double size) {
        view = new Circle(size);
    }

    public void move() {

        Parent canvas = view.getParent();

        view.setLayoutX(view.getLayoutX() + dx);
        view.setLayoutY(view.getLayoutY() + dy);

        final Bounds bounds = canvas.getBoundsInLocal();
        boolean right = view.getLayoutX() >= (bounds.getMaxX() - view.getRadius());
        boolean left = view.getLayoutX() <= (bounds.getMinX() + view.getRadius());
        boolean bottom = view.getLayoutY() >= (bounds.getMaxY() - view.getRadius());
        boolean top = view.getLayoutY() <= (bounds.getMinY() + view.getRadius());

        if (right || left) {
            dx *= -1;
        }
        if (bottom || top) {
            dy *= -1;
        }
    }

    public Node getView() {
        return view ;
    }
}

现在你可以创建一个新球,打电话给canvas.getChildren().add(ball.getView()),你所要做的就是调用ball.move()

另一种方法就是从Ball类公开适当的方法:

public double getX() {
    return view.getLayoutX();
}

public void setX(double x) {
    view.setLayoutX(x);
}
等等,但第一种方法似乎更简单。

This demo使用相同的想法稍微复杂一点。