第一次使用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;当Timeline
与KeyFrame
和EventHandler
放在一起时,会在墙壁上反弹。现在我试图弄清楚如何使用Ball
球,因为使用我自己的方法getLayout()
,setLayout()
和getRadius()
无法解决宾语。我如何解决这个问题/建立我自己的setLayout()
等?
答案 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使用相同的想法稍微复杂一点。