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