Я - как и многие начинающие программисты - у меня возникают проблемы с ссылкой на открытый, нестатический метод из разных классов. Я пытаюсь создать игру в 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);
}
}
Благодарим вас за советы. Я добавил свой код и в процессе поиска MVC. – Nathan