OrlovEvgenii
@OrlovEvgenii
golang developer / DevOps

JavaFX Как повторно вызвать initialize из другого initialize?

MainController в котором всего раз вызывается initialize.
public class MainController {
    final Query PURGE = new Query();

    @FXML
    private Button idAdd;
    @FXML
    private Button idRemove;
    @FXML
    private ObservableList<ViewTable> usersData = FXCollections.observableArrayList();
    @FXML
    private TableView<ViewTable> idTable;
    @FXML
    private TableColumn<ViewTable, Integer> idNumColumn;
    @FXML
    private TableColumn<ViewTable, String> idNameValueColumn;
    @FXML
    private TableColumn<ViewTable, String> idCountColumn;

    @FXML
    public void initialize() throws Exception {
            initData();
            idNumColumn.setCellValueFactory(new PropertyValueFactory<ViewTable, Integer>("id"));
            idNameValueColumn.setCellValueFactory(new PropertyValueFactory<ViewTable, String>("nameValue"));
            idCountColumn.setCellValueFactory(new PropertyValueFactory<ViewTable, String>("count"));
            idTable.setItems(usersData);

            idAdd.setOnAction(new EventHandler<ActionEvent>() {
                public void handle(ActionEvent event) {
                    try {
                        //генерируем и вызываем вторую форму, в которой соответственно вызывается уже свой initialize
                        UIGenerate uiGenerate = new UIGenerate("addForm", "AddFormStart");
                        Stage stage = uiGenerate.startUIGenerate();
                        stage.show();

                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
}
private void initData() {
        try{
            ResultSet resultSet = PURGE.getAll();

            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String nameValue = resultSet.getString("namevalue");
                String count = resultSet.getString("count");
                usersData.add(new ViewTable(id, nameValue, count));

            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
//дергаем последнею запись из базы
public void lastRecord() {
        try{
            ResultSet resultSet = PURGE.getLastRecord();

            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String nameValue = resultSet.getString("namevalue");
                String count = resultSet.getString("count");
                usersData.add(new ViewTable(id, nameValue, count));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }


Вторая форма в которой вызывается уже свой initialize.
public class AddFormController extends MainController {
    @FXML
    private AnchorPane idAnchorPane;
    @FXML
    private TextField idNameValue;
    @FXML
    private TextField idCountValue;
    @FXML
    private Button idAddButton;
    @FXML
    private Button idCloseButton;
    @FXML
    private Label idMessage;

    @FXML
    public void initialize() throws Exception{

        idCloseButton.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent event) {
                try {
                    UIGenerate uiGenerate = new UIGenerate("addForm", "AddFormStart");
                    Stage stage = uiGenerate.startUIGenerate();
                    stage.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        });

        idAddButton.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent event) {

                String nameValue = idNameValue.getText().trim();
                int countValue = Integer.parseInt(idCountValue.getText());
                Query query = new Query();

                try {
                    if (!nameValue.isEmpty()) {
                        query.queryAdd(nameValue, countValue);
                        UIGenerate uiGenerate = new UIGenerate("addForm", "AddFormStart");
                        Stage stage = uiGenerate.startUIGenerate();
                        stage.close();
                    } else {
                        idMessage.setText("Error");
                        idMessage.setVisible(true);
                    }

                } catch (SQLException e) {
                    e.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }


}


Собственно теперь, как настроить плотную связь между двумя разными формами?
В моем случае требуется, что бы при нажатии на кнопку находящийся на форме2, вызывалось событие на форме1. В данном примере пытаюсь добиться того, чтобы после записи данных в бд на форме2, после закрытия формы, только что записанные данные сразу подгружались в таблицу на форме1.

Собственно повторный вызов initialize формы1, из initialize формы2, либо вообще не давал должного результата либо приводил к java.lang.NullPointerException

Собственно я уже предполагаю что в целом у меня нарушена логика всего проекта, и что то явно я делаю не так
https://github.com/ChristianLisov/InventoryControl полный код проекта, для тех кто готов направить меня в нужное русло, дабы познать дзен.
  • Вопрос задан
  • 1172 просмотра
Решения вопроса 1
OLDRihard
@OLDRihard
Java Developer
Ну я взаимодействие делал так:
FXMLLoader something = new FXMLLoader(fxml);
root = something.load();

После инициализации контроллера выцепляем его следующей командой
ctrl = something.getController();
И передаем ему ссылки на объекты, которые надо изменять из другого контроллера
ctrl.setData(textField);

У меня взаимодействие было по мнимому - мне хватало этого.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
import javafx.fxml.Initializable;

public class MainController implements Initializable {

    // ...

    @FXML
    public void initialize(URL location, ResourceBundle resources) {

       // ...

    }

// ...

}


public class AddFormController extends MainController {

    // ...

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        super.initialize(location, resources);

        // ...

    }

    // ...

}


5cdbddefb148b718914235.jpeg
Introduction to FXML
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы