我 - 像许多初学程序员一样 - 在从类中引用公共的非静态方法时遇到问题。我正在尝试在JavaFX中构建游戏,并且想要使用来自另一个类的按钮(称为B类)来创建新游戏。我知道要创建一个新游戏我必须在我的主类中使用以下代码(称之为A类):
stage.close();
start(stage);
由于stage是A类中的非静态变量,我无法在B类中直接引用它。为了解决这个问题,我在A类中创建了如下所示的方法:
public void newGame() {
stage.close();
start(stage);
}
由于这不是(也不可能是)静态方法,我不能直接从B类引用它。因此,为了访问该方法,我在B类中生成了以下代码,其中newGameBT是B类的按钮创建一个新游戏:
newGameBT.setOnAction(e -> (new ClassA()).newGame());
当我运行程序并单击按钮时,我得到一个空指针异常。我相信这样做的原因是因为我在方法调用中创建了一个全新的类,导致了范围的某种错误,但如果我的理由接近正确,我并不完全确定完全的原因。
我已经浏览了很多网站,并找到了像这里使用的解决方案一样的解决方案"解决方案"对于静态变量,但我似乎无法让它正常工作。那么有没有办法解决这个问题而不使按钮或舞台静止?
以下是我当前的代码,不包含任何不必要的内容:
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 :(得分:0)
您的问题是如何处理所需的引用,并且您认为将这些引用分配给静态字段是错误的,因为这会增加代码的耦合,增加圈复杂度并增加风险虫子
不幸的是,没有一个通用的解决方案,最好的解决方案将取决于您的程序的整体结构,这是我们目前所知甚少的。一个“简单”的解决方案是简单地传递引用它们所需的位置,例如将对当前可视化和运行的ClassA对象的引用传递给需要能够调用其方法的任何地方,但这也会增加耦合和复杂性并且正在努力减少这种耦合,已经创建了许多方案,包括诸如模型 - 视图 - 控制器之类的设计模式(我认为你应该看起来是int),以及“依赖注入”。
作为对一般问题的一般建议,我建议您首先查看模型 - 视图 - 控制器,并尝试将至少一些原则应用于您的程序 - 至少尝试重构逻辑从视角来看。如果您需要更具体的建议,那么您将需要提出一个更具体的问题,并附上您的minimal example program or MCVE代码。