gpt4 book ai didi

java - 避免 JavaFX 中跨类的静态

转载 作者:太空宇宙 更新时间:2023-11-04 12:34:20 25 4
gpt4 key购买 nike

我 - 像许多新手程序员一样 - 在跨类引用公共(public)非静态方法时遇到困难。我正在尝试在 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);

}

}

最佳答案

您的问题是如何获取所需引用的句柄,并且您正确地认为将这些引用分配给静态字段是不好的,因为这会增加代码的耦合性,增加圈复杂度并增加错误的风险。

不幸的是,没有一刀切的解决方案,最好的解决方案将取决于程序的整体结构,而我们目前对此知之甚少。一个“简单”的解决方案是简单地将引用传递到需要它们的地方,例如将对当前可视化和运行的 ClassA 对象的引用传递到需要能够调用其方法的任何地方,但这也增加了耦合和复杂性,并且为了减少这种耦合,已经创建了许多方案,包括诸如模型- View - Controller (我认为你应该关注的东西)之类的设计模式,以及“依赖注入(inject)”。

作为针对一般问题的一般建议,我建议您首先研究模型- View - Controller ,并尝试将至少一些原则应用到您的程序中 - 至少尝试从 View 重构逻辑。如果您需要更具体的建议,那么您将不得不提出更具体的问题,并填写您的 minimal example program or MCVE代码。

关于java - 避免 JavaFX 中跨类的静态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37494209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com