2015-03-20 3 views
-1

Мне нужно создать программу с использованием JavaFX, которая создает панель с шаром в ней. Есть четыре кнопки, которые перемещают мяч влево, вправо, вверх или вниз. Я не понимаю, почему, когда я перехожу к определению каждого метода (например, показанный .left()), вызов метода выше остается ошибкой, которая говорит мне, что она не определена.JavaFx - метод Undefined

Основной класс:

import javafx.application.Application; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.layout.StackPane; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Circle; 
import javafx.stage.Stage; 

public class MoveTheBall extends Application { 
    @Override 
    public void start(Stage primaryStage) { 
     StackPane pane = new StackPane(); 
     Circle circle = new Circle(20); 
     circle.setStroke(Color.BLACK); 
     circle.setFill(Color.WHITE); 
     pane.getChildren().add(circle); 

     HBox hBox = new HBox(); 
     hBox.setSpacing(10); 
     hBox.setAlignment(Pos.CENTER); 
     Button btLeft = new Button("Left"); 
     Button btRight = new Button("Right"); 
     Button btUp = new Button("Up"); 
     Button btDown = new Button("Down"); 
     hBox.getChildren().add(btLeft); 
     hBox.getChildren().add(btRight); 
     hBox.getChildren().add(btUp); 
     hBox.getChildren().add(btDown); 

     BorderPane borderPane = new BorderPane(); 
     borderPane.setCenter(pane); 
     borderPane.setBottom(hBox); 
     BorderPane.setAlignment(hBox, Pos.CENTER); 

     Scene scene = new Scene(borderPane, 300, 200); 
     primaryStage.setTitle("Move The Ball"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 

    } 
} 

Кнопки Класс:

import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.layout.StackPane; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Circle; 
import javafx.stage.Stage; 

public class ControlBall extends Application { 
    private MoveTheBall moveTheBall = new MoveTheBall(); 

    @Override 
    public void start(Stage primaryStage) { 

     HBox hBox = new HBox(); 
     hBox.setSpacing(5); 
     hBox.setAlignment(Pos.CENTER); 
     Button btLeft = new Button("Left"); 
     Button btRight = new Button("Right"); 
     Button btUp = new Button("Up"); 
     Button btDown = new Button("Down"); 
     hBox.getChildren().add(btLeft); 
     hBox.getChildren().add(btRight); 
     hBox.getChildren().add(btUp); 
     hBox.getChildren().add(btDown); 

     btLeft.setOnAction(new LeftHandler()); 
     btRight.setOnAction(new RightHandler()); 
     btUp.setOnAction(new UpHandler()); 
     btDown.setOnAction(new DownHandler()); 

     BorderPane borderPane = new BorderPane(); 
     borderPane.setCenter(moveTheBall); 
     borderPane.setBottom(hBox); 
     BorderPane.setAlignment(hBox, Pos.CENTER); 

     Scene scene = new Scene(borderPane, 200, 150); 
     primaryStage.setTitle("Move The Ball"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    class LeftHandler implements EventHandler<ActionEvent> { 
     @Override 
     public void handle(ActionEvent e) { 
      moveTheBall.left(); // error because no class yet 
     } 
    } 

    class RightHandler implements EventHandler<ActionEvent> { 
     @Override 
     public void handle(ActionEvent e) { 
      moveTheBall.right(); // error because no class yet 
     } 
    } 

    class UpHandler implements EventHandler<ActionEvent> { 
     @Override 
     public void handle(ActionEvent e) { 
      moveTheBall.up(); // error because no class yet 
     } 
    } 

    class DownHandler implements EventHandler<ActionEvent> { 
     @Override 
     public void handle(ActionEvent e) { 
      moveTheBall.down(); // error because no class yet 
     } 
    } 
} 

class moveTheBall extends StackPane { 
    private Circle ball = new Circle(20); 

    public moveTheBall() { 
     getChildren().add(ball); 
     ball.setStroke(Color.BLACK); 
     ball.setFill(Color.WHITE); 
    } 

    public void left() { 
     ball.setCenterX(-2.0); 
     ball.setCenterY(-2.0); 
    } 
} 

Линия borderPane.setCenter (moveTheBall); также дает мне проблемы. «Метод setCenter (Node) в типе BorderPane не применим для аргументов (MoveTheBall)»

+0

Если вы хотите написать сообщение, по крайней мере, прокомментировать почему. – Monocyte

ответ

2

Я довольно новичок в JavaFX, но я сделаю все, что в моих силах.

Я предложил бы вместо того, чтобы делать совершенно отдельные классы для управления мячом, перемещения мяча и обработки каждой кнопки, изучая использование лямбда-выражений, чтобы упростить код и уменьшить вашу комнату за ошибку. Например, вы можете установить, что делает кнопка btRight, написав такую ​​строку:

btRight.setOnAction(e -> { 
    //if the ball is inside the right limit 
     //Move the ball to the right 
}); 

Вы можете написать эти выражения непосредственно в ваш метод start() и избежать определения внутренних классов, а также отдельный класс для контроль.

Насколько вы ошибаетесь, мое лучшее предположение (как я уже сказал, я новичок в этом) заключается в том, что moveTheBall() является конструктором для класса MoveTheBall, но он называется как метод.

Надеюсь, это поможет.

+0

Я ценю помощь. Я попробую и дам вам знать. Кажется, я один в лесу. Я не могу найти очень много источников, которые помогут. Все использует свинг. – Monocyte

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