2016-05-28 2 views
1

Я - как и многие начинающие программисты - у меня возникают проблемы с ссылкой на открытый, нестатический метод из разных классов. Я пытаюсь создать игру в JavaFX и хочу использовать кнопку из другого класса (назовите ее классом B), чтобы создать новую игру. Я знаю, чтобы создать новую игру, я должен использовать следующий код в моем основном классе (назову его класс А):Избегайте статики по классам в JavaFX

stage.close(); 
start(stage); 

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

public void newGame() { 
    stage.close(); 
    start(stage); 
} 

Поскольку это не является (и не может быть) статический метод, не может непосредственно ссылаться на это из класса В. Поэтому, чтобы доступ к методу, я сгенерировал код ниже в классе B, где newGameBT является кнопкой из класса B, чтобы создать новую игру:

newGameBT.setOnAction(e -> (new ClassA()).newGame()); 

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

Я просмотрел многие веб-сайты и нашел решение, подобное используемому здесь, как «обход» для статических переменных, но я не могу заставить его работать правильно. Итак, есть ли способ обойти это без создания кнопки или статической статичности?

Ниже мой текущий код без учета каких-либо ненужных содержания:

Класс A:

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.layout.GridPane; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Rectangle; 
import javafx.stage.Stage; 

public class ClassA extends Application { 

    Stage stage; 

    @Override 
    public void start(Stage stage) { 

     this.stage = stage; 

     GridPane pane = new GridPane(); 
     Rectangle r = new Rectangle(50, 50, Color.RED); 
     pane.add(r, 0, 0); 
     pane.add(new ClassB(), 0, 1); 

     // Create the primary scene 
     Scene scene = new Scene(pane); 
     stage.setScene(scene); 
     stage.show(); 

    } 

    public void newGame() { 
     stage.close(); 
     start(stage); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 

} 

Класс B:

import javafx.scene.control.Button; 
import javafx.scene.layout.Pane; 

public class ClassB extends Pane { 

    public ClassB() { 

     Button newGameBT = new Button("New Game"); 

     newGameBT.setOnAction(e -> (new ClassA()).newGame()); 

     getChildren().add(newGameBT); 

    } 

} 

ответ

0

Ваша проблема одна о том, как получить ручку на нужная ссылка, и вы правы, думая, что присвоение этих ссылок на статические поля плохо, поскольку это увеличивает сцепление вашего кода, увеличивает циклическую сложность и увеличивает риск ошибок.

К сожалению, не существует единого подхода, и лучшее решение будет зависеть от общей структуры вашей программы, о чем мы в настоящее время мало знаем. «Простое» решение состоит в том, чтобы просто передать ссылки на то, где они необходимы, например, передать ссылку на текущий визуализированный и запущенный объект ClassA в любом месте, где нужно вызывать его методы, но это также увеличивает сцепление и сложность , и это делается с целью уменьшить эту связь, что было создано множество схем, включая такие шаблоны проектирования, как Model-View-Controller (что-то, на что я думаю, что вы должны смотреть int), а также «инъекция зависимостей».

Как общий совет по общему вопросу, я предлагаю вам начать работу с Model-View-Controller и попытаться применить по крайней мере некоторые из принципов к вашей программе - по крайней мере, попытайтесь реорганизовать логики с точки зрения. Если вам нужен более конкретный совет, тогда вам нужно будет задать более конкретный вопрос, в комплекте с кодом minimal example program or MCVE.

+0

Благодарим вас за советы. Я добавил свой код и в процессе поиска MVC. – Nathan