Как передать значения уже открытому этапу(первому контроллеру) из второго контроллера?
У меня есть два контроллера
1. ' FXMLDocumentController` имеет `TableView` CustomerTable.
2. `NewCustomerController` второй контроллер для добавления новой строки.
Я могу передавать значения от первого контроллера ко второму контроллеру.
Но я не могу вернуть его со второго контроллера на первый контроллер.
Что я уже пробовал:
FXMLDocument.FXML-файл
<AnchorPane id="AnchorPane" prefHeight="283.0" prefWidth="437.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1"fx:controller="mytableview.FXMLDocumentController"> <children> <Button fx:id="button" layoutX="309.0" layoutY="25.0" onAction="#handleButtonAction" text="New Customer" /> <TableView fx:id="customerTable" layoutX="6.0" layoutY="61.0" prefHeight="215.0" prefWidth="426.0"> <columns> <TableColumn fx:id="custname" prefWidth="75.0" text="Customer Name" /> <TableColumn fx:id="city" prefWidth="75.0" text="City" /> </columns> <columnResizePolicy> <TableView fx:constant="CONSTRAINED_RESIZE_POLICY" /> </columnResizePolicy> </TableView> </children> </AnchorPane>
NewCustomer.FXML-файл
<AnchorPane id="AnchorPane" prefHeight="172.0" prefWidth="209.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.171" fx:controller="com.newcustomer.NewCustomerController"> <children> <Button layoutX="141.0" layoutY="129.0" mnemonicParsing="false" onAction="#newCustomer" text="Add" /> <TextField fx:id="cNameTextField" layoutX="14.0" layoutY="26.0" promptText="Customer Name" /> <pre><pre lang="xml"> <TextField fx:id="custCityTextField" layoutX="14.0" layoutY="77.0" promptText="City" /> </children> </AnchorPane>
FXMLDocumentController.java
public class FXMLDocumentController implements Initializable { @FXML public TableView<Customer> customerTable; @FXML public TableColumn<Customer, String> custname; @FXML public TableColumn<Customer, String> city; @Override public void initialize(URL url, ResourceBundle rb) { } @FXML private void handleButtonAction(ActionEvent event) throws IOException { Parent parent = FXMLLoader.load(getClass().getResource("/com/newcustomer/NewCustomer.fxml")); Stage stage = new Stage(); Scene scene = new Scene(parent); stage.setScene(scene); stage.show(); } public void inflateUI(Customer customer) { custname.setCellValueFactory(new PropertyValueFactory<>("name")); city.setCellValueFactory(new PropertyValueFactory<>("city")); customerTable.getItems().add(customer); }
NewCustomerController.java
public class NewCustomerController implements Initializable { @FXML private TextField cNameTextField; @FXML private TextField custCityTextField; @Override public void initialize(URL url, ResourceBundle rb) { } public void newCustomer(ActionEvent e) throws IOException { String name = cNameTextField.getText(); String stringCity = custCityTextField.getText(); Customer customer = new Customer(10, name, stringCity); FXMLLoader fXMLLoader = new FXMLLoader(getClass().getResource("/mytableview/FXMLDocument.fxml")); FXMLDocumentController fXMLDocumentController = fXMLLoader.<FXMLDocumentController>getController(); fXMLDocumentController.inflateUI(customer); // Getting NPE at this line. } }
MyTableView.java
public class MyTableView extends Application { public MyTableView() { } @Override public void start(Stage stage) throws Exception { Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml")); Scene scene = new Scene(root); stage.setScene(scene); stage.show(); } public static void main(String[] args) { launch(args); } }
Я получаю NPE здесь на этой линии
fXMLDocumentController.inflateUI(customer); // Getting NPE at this line.
В NewCustomerController.java.
Вот исходный код Uploadfiles.io - MyTableView.zip[^]