2015-08-28 2 views
-1

Для полноты я предоставил весь код ниже.Java: проблема с некоторым синтаксисом кода

Пожалуйста, помогите мне перевести следующее английское:

protected void moveBall() { 
     for (Node node:this.getChildren()) { 
      Ball ball = (Ball)node; 

// некоторый другой код.

Вот моя (неверная) интерпретация:

Получить ссылку на узел, и установить ссылку равной для всех узлов в этом классе.

Получите ссылку на Ball и установите его равным узлу, который должен быть отлит как Ball.

Кроме того, не зная, как интерпретировать вышеупомянутый код, я также не понимаю, что он делает.

Второй вопрос о классе окружности:

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); 
     } 
    } 

бы применение супер метод эквивалентен следующему:

this.x = x; 
this.y = y; 
this.radius = radius; 

почему или почему нет?

MultipleBounceBalls общественный класс расширяет Application {

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 

}

+0

Если у вас есть два разных вопроса, задайте два разных вопроса. Не вежливо спрашивать двух в одном, поскольку это связывает фактические проблемы (проблемы), которые у вас есть. – Makoto

+0

Я не хочу наводнять вас другим ответом, но другие ответы, похоже, не затрагивают ваш вопрос о круге должным образом. Предполагая, что вы вызываете javafx.scene.shape.Circle (двойной, двойной, двойной), то нет, они не эквивалентны. Вызов этого конструктора Circle немного сложнее. Вы можете проследить через код здесь: http://grepcode.com/file/repo1.maven.org/maven2/net.java.openjfx.backport/openjfx-78-backport/1.8.0-ea-b96.1/ javafx/scene/shape/Circle.java # Круг.% 3Cinit% 3E% 28double% 2Cdouble% 2Cdouble% 29 – searchengine27

+0

Благодарим за отзыв. Приношу свои извинения, я обязательно буду задавать один вопрос одновременно. – Frosty619

ответ

0

1) Что касается этого:

protected void moveBall() { 
    for (Node node: this.getChildren()) { 
     Ball ball = (Ball)node; 

Цикл for в этом случае больше foreach, где она проходит через каждый узел у детей. Для каждого узла создается объект Ball путем литья node в Ball. В более понятном английском языке:

Для каждого узла в наборе детей, который этот объект имеет, бросает каждый, чтобы стать шаром.

Кастинг по существу говорит о том, что один тип данных (в данном случае Node) должен рассматриваться как другой (в данном случае Ball). Для получения дополнительной информации о том, что такое литье, ссылка: https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

2) super() вызывает родительский конструктор, который в этом случае будет Circle. Поскольку конструктор не подключен, это будет только догадки, но логично полагать, что конструктор Circle выполнит указанные вами функции. Хорошая рекомендация для супер() находится здесь: super() in Java

Надеюсь, это помогло!

0

Это декодирует к:

Получить все дети this с помощью this.getChildren() назначить первый из них в node.

Затем должна быть запущена следующая строка, эта строка создает локальную переменную ball, которая равна node, после того как она будет отправлена ​​на бал.

Сделайте другой код.

Повторяйте, пока не осталось больше детей.

Что касается круга, как вы звоните super, возможно, это не так просто, суперструктор может устанавливать переменные или он может выполнять некоторую другую логику. Поэтому было бы безопаснее назвать конструктора, на мой взгляд.

  • Culip
+0

«Получите все дети этого, используя this.getChildren(), назначая их узлу». Это не верно. Цикл for выполняет итерацию по каждому дочернему по одному и индивидуально устанавливает «узел» определенному дочернему элементу (в порядке, определенном итератором), выполняет логику внутри блока после цикла for и когда он завершается , присваивает следующий дочерний элемент переменной 'node'. – searchengine27

+0

@ searchengine27 Вот что я сказал ... Opps Я случайно оставил слово один ... – Curlip

+0

Добавил его в редактирование. – Curlip

0

Предположив правильный синтаксис на следующем:

protected void moveBall() { 
    for (Node node:this.getChildren()) { 
     Ball ball = (Ball)node; 
    } 
} 

Это может быть прочитано как:

"Для каждого элемента в Iterable/массив из результатом звонка getChildren(), указанным здесь node и типа Node назначьте ручной приведение node на тип Ball на переменную типа Ball под названием ball. "

Второе:

Не видя декларацию за Circle это сказать невозможно. Однако, если декларация в Circle фактически делает, принимайте эти значения carte-blanche, а делает присваивает их этим родительским полям, то да, это было бы эквивалентно.

Смежные вопросы