Я хочу установить для каждого fxml один контроллер.Эти контроллеры должны быть в состоянии взаимодействовать, но я всегда получаю NullPointerException
.У меня есть один FXML с Button
и один FXML с TextField
.Если я нажму Button
, TextField
должен добавить.Я немного уменьшил код.Я знаю, что эти вопросы задают много раз, но у меня ничего не получается.
Вот мой код:
Контроллер для LogStage.fxml
.Вот TextArea
, где я бы установил текст.
public class LogController{
@FXML private TextArea logTextAreaFx;
public void handlelogTextAreaFX(ActionEvent event, String text){
logTextAreaFx.appendText(text);
}
}
Контроллер для MainStage.fxml
.Главное окно с Button
, которому следует установить TextArea
, если он активирован.
public class MainController{
@FXML LogController logController;
public void handleChatConsoleButton(ActionEvent event){
logController.handlelogTextAreaFX(event, "test");
}
}
LogStage.fxml:
<VBox prefWidth="500" prefHeight="300" id="logView" fx:controller="LogController" xmlns:fx="http://javafx.com/fxml" >
<TextArea text="-------- Log ---------" id="logTextArea" fx:id="logTextAreaFx"></TextArea>
</VBox>
MainStage.fxml:
<VBox minHeight="520" minWidth="1280" fx:controller="MainController" xmlns:fx="http://javafx.com/fxml">
<Button text="test Button" onAction="#handleChatConsoleButton"></Button>
</VBox>
Главный контроллер.Эти контроллеры должны установить все контроллеры и экземпляры и запустить 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();
}
}