在JavaFX中避免跨类的静态

时间:2016-05-28 00:54:31

标签: java javafx static static-methods

我 - 像许多初学程序员一样 - 在从类中引用公共的非静态方法时遇到问题。我正在尝试在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);

    }

}

1 个答案:

答案 0 :(得分:0)

您的问题是如何处理所需的引用,并且您认为将这些引用分配给静态字段是错误的,因为这会增加代码的耦合,增加圈复杂度并增加风险虫子

不幸的是,没有一个通用的解决方案,最好的解决方案将取决于您的程序的整体结构,这是我们目前所知甚少的。一个“简单”的解决方案是简单地传递引用它们所需的位置,例如将对当前可视化和运行的ClassA对象的引用传递给需要能够调用其方法的任何地方,但这也会增加耦合和复杂性并且正在努力减少这种耦合,已经创建了许多方案,包括诸如模型 - 视图 - 控制器之类的设计模式(我认为你应该看起来是int),以及“依赖注入”。

作为对一般问题的一般建议,我建议您首先查看模型 - 视图 - 控制器,并尝试将至少一些原则应用于您的程序 - 至少尝试重构逻辑从视角来看。如果您需要更具体的建议,那么您将需要提出一个更具体的问题,并附上您的minimal example program or MCVE代码。