每个fxml的控制器(JavaFX)

每个fxml的控制器(JavaFX),javafx,nullpointerexception,controller,fxml,Javafx,Nullpointerexception,Controller,Fxml,我想为每个fxml设置一个控制器。这些控制器应该能够交互,但我总是得到一个NullPointerException。我有一个带有按钮的fxml和一个带有文本字段的fxml。如果我按下按钮,则文本字段应追加。 我已经减少了一点代码。我知道这些问题被问了很多次,但对我来说没有任何效果 这是我的代码: 用于LogStage.fxml的控制器。这里是text区域,我将在这里设置文本 public class LogController{ @FXML private TextArea logTex

我想为每个fxml设置一个控制器。这些控制器应该能够交互,但我总是得到一个
NullPointerException
。我有一个带有
按钮的fxml和一个带有
文本字段的fxml。如果我按下
按钮
,则
文本字段
应追加。 我已经减少了一点代码。我知道这些问题被问了很多次,但对我来说没有任何效果

这是我的代码:
用于
LogStage.fxml
的控制器。这里是
text区域
,我将在这里设置文本

public class LogController{
    @FXML private TextArea logTextAreaFx;
    public void handlelogTextAreaFX(ActionEvent event, String text){
        logTextAreaFx.appendText(text);
    }
}
MainStage.fxml的控制器。主窗口,带有
按钮
,如果激活,谁应该设置
文本区域

public class MainController{
    @FXML LogController logController;
    public void handleChatConsoleButton(ActionEvent event){
        logController.handlelogTextAreaFX(event, "test");
    }
}
LogStage.fxml:


MainStage.fxml:


主控制器。这些控制器应设置所有控制器和实例化,并启动
GameView

public class ClientController {
    private ClientView clientView;
    @FXML private MainController mainController;
    @FXML private LogController logController;
    public ClientController(){
        this.clientView = new ClientView();
    }
    public void showView(){
        this.clientView.startView();
    }
    public void setText(String text){
        logController.handlelogTextAreaFX(null, "hello world");
    }
}
这些类启动整个应用程序

public class GameMain {
    static ClientController controller;
    public static void main(String[] args){
        controller = new ClientController();
        controller.showView();
    }
}
ClientView设置所有框并启动fxml

public class ClientView extends Application{
    VBox root = new VBox();
    VBox mainStage;
    public void startView(){
        launch();
    }
    @Override
    public void start(Stage primaryStage) throws Exception {
        Scene scene = new Scene(root);
        loadMainStage();
        loadLogStage();
        primaryStage.setScene(scene);
        primaryStage.show();
    }


     @FXML Pane MainStage;
    public void loadMainStage(){
        mainStage = new VBox();
        try {
            mainStage = FXMLLoader.load(getClass().getClassLoader().getResource("MainStage.fxml"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        root.getChildren().add(mainStage);
    }
    @FXML VBox LogStage;
    public void loadLogStage(){
        //ClientController controller = new ClientController();
        FXMLLoader loader = new FXMLLoader();
        Pane root = new Pane();
        Scene chatScene = new Scene(root);
        Stage stage = new Stage();
        stage.setTitle("Log View");
        stage.setScene(chatScene);
        stage.setResizable(true);
        try {
            //loader.setController(controller);
            LogStage = loader.load(getClass().getClassLoader().getResource("LogStage.fxml"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        root.getChildren().add(LogStage);
        stage.show();
    }
}

如果您已经在FXML中描述了
fx:controller
,则应使用
@FXML
从fxmloader获取控制器实例。控制器中的字段由
fxmloader
初始化为FXML文件中
fx:id
与字段名称匹配的元素。
MainStage.fxml
中没有包含
fx:id=logController
的元素,因此
logController
永远不会初始化-即,它保持为null,您将获得一个NPE。现在还不清楚你会怎么期待这一切。假设您加载了两次
LogStage.fxml
,因此有两个
LogController
实例。您希望
MainController
中的字段引用哪一个?类似地,您的
ClientController
ClientView
类似乎都不是任何FXML的控制器类。在
ClientView
类中,您正在以通常的方式初始化字段(为它们赋值),因此它们不应该被注释
@FXML
。在
ClientController
中,
mainController
logController
将始终为空。