为了完整起见,我在下面提供了完整的代码。
请帮我翻译以下英文内容:
class Ball extends Circle {
private double dx = 1;
private double dy = 1;
public Ball (double x, double y, double radius, Color color) {
super(x,y,radius);
setFill(color);
}
}
//其他一些代码。
这是我的(不正确的)解释:
获取对Node的引用,并将引用设置为等于此类中的所有节点。
获取Ball的引用,并将其设置为node,将其转换为Ball。
除了不知道如何解释上述代码外,我也不太了解它的作用。
第二个问题是关于圈子类:
this.x = x;
this.y = y;
this.radius = radius;
调用super方法将等同于以下内容:
public void start(Stage primaryStage) {
MultipleBallsPane ballsPane = new MultipleBallsPane();
Button btnAddBall = new Button("+");
Button btnRemoveBall = new Button("-");
HBox hBox = new HBox();
hBox.getChildren().addAll(btnAddBall, btnRemoveBall);
hBox.setAlignment(Pos.CENTER);
//add or remove ball
btnAddBall.setOnMousePressed(e -> ballsPane.add());
btnRemoveBall.setOnMousePressed(e -> ballsPane.subtract());
//resume and pause animation
ballsPane.setOnMousePressed(e -> ballsPane.pause());
ballsPane.setOnMouseReleased(e -> ballsPane.play());
//scroll bar to control animation speed
ScrollBar sbSpeed = new ScrollBar();
sbSpeed.setMax(20);
sbSpeed.setMin(10);
ballsPane.rateProperty().bind(sbSpeed.valueProperty());
HBox hBox2 = new HBox();
hBox2.getChildren().addAll(sbSpeed);
hBox2.setAlignment(Pos.CENTER);
BorderPane pane = new BorderPane();
pane.setTop(hBox2);
pane.setCenter(ballsPane);
pane.setBottom(hBox);
Scene scene = new Scene(pane,250, 150);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
Application.launch(args);
}
// inner class MultipleBallsPane
private class MultipleBallsPane extends Pane {
private Timeline animation;
public MultipleBallsPane() {
//create an animation for moving the ball
animation = new Timeline(
new KeyFrame(Duration.millis(50), e->moveBall()));
animation.setCycleCount(Timeline.INDEFINITE);
animation.play();
}
public void add() {
Color color = new Color(Math.random(),
Math.random(), Math.random(), 0.5);
getChildren().add(new Ball(30,30,20, color));
}
public void subtract() {
if (getChildren().size() > 0 ) {
getChildren().remove(getChildren().size() - 1);
}
}
public void play() {
animation.play();
}
public void pause() {
animation.pause();
}
public void increaseSpeed() {
animation.setRate(animation.getRate() + 0.5);
}
public void decreaseSpeed() {
if (animation.getRate() > 0) {
animation.setRate(animation.getRate() - 0.5);
}
}
public DoubleProperty rateProperty() {
return animation.rateProperty();
}
protected void moveBall() {
for (Node node:this.getChildren()) {
Ball ball = (Ball)node;
//check boundaries
if (ball.getCenterX() < ball.getRadius() ||
ball.getCenterX() > getWidth() - ball.getRadius()) {
ball.dx*= -1;
}
if (ball.getCenterY() < ball.getRadius() ||
ball.getCenterY() >getHeight() - ball.getRadius()) {
ball.dy*= -1;
}
ball.setCenterX(ball.dx + ball.getCenterX());
ball.setCenterY(ball.dy + ball.getCenterY());
}
} // end of method
class Ball extends Circle {
private double dx = 1;
private double dy = 1;
public Ball (double x, double y, double radius, Color color) {
super(x,y,radius);
setFill(color);
}
}
} // end of MultipleBallsPane class
为什么或为什么不呢?
公共类MultipleBounceBalls扩展了Application {
{{1}}
}
答案 0 :(得分:0)
1)关于这个:
protected void moveBall() {
for (Node node: this.getChildren()) {
Ball ball = (Ball)node;
在这种情况下,for
循环更多地是foreach
,它通过子节点中的每个节点。对于每个节点,通过将Ball
强制转换为node
来创建Ball
对象。简洁的英语:
对于此对象具有的子集中的每个节点,将每个节点转换为Ball。
Casting本质上是说一种数据类型(在本例中为Node
)将被视为另一种(在本例中为Ball
)。有关铸件的更多信息,请参考:https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
2)super()
调用父构造函数,在本例中为Circle
。由于没有附加构造函数,所以只会猜测,但是相信Circle
构造函数会执行您指定的函数是合乎逻辑的。 super()的一个很好的参考是:super() in Java
希望这有帮助!
答案 1 :(得分:0)
这解码为:
让this
的所有孩子使用this.getChildren()
将其中第一个孩子分配到node
。
然后下一行应该运行,这一行创建一个局部变量ball
,它等同于node
,然后将其转换为Ball。
做其他代码。
重复直到不再有孩子离开。
至于圆圈,当你调用super
时,它可能不那么简单,超级构造函数可以设置变量,或者它可以做一些其他逻辑。因此,在我看来,调用构造函数会更安全。
答案 2 :(得分:0)
假设以下语法正确:
protected void moveBall() {
for (Node node:this.getChildren()) {
Ball ball = (Ball)node;
}
}
这可以理解为:
&#34; 对于getChildren()
调用结果中可迭代/数组中的每个元素,此处引用为node
且类型为{{1} },将Node
的手动广告投放到类型为node
的{{1}} Ball
类型的变量。&#34;
第二
没有看到Ball
的声明,这是不可能的。但是,如果ball
中的声明确实接受了这些值,并且 将它们分配给那些特定的父字段,那么是的,它会相当于。