更新结构JavaFX TreeTableView

问题描述 投票:0回答:1

我创建了两个窗口,并将实例控制器作为参数传递给子窗口。我的问题是即时更新。我尝试在treeTblState上调用refresh()方法,但没有任何结果。

第一个窗口

<AnchorPane xmlns="http://javafx.com/javafx/18" xmlns:fx="http://javafx.com/fxml/1" fx:controller="mo.specdoc.controllers.StateController">
   <children>
      <TreeTableView fx:id="treeTblState" showRoot="false">
        <columns>
          ....
        </columns>
      </TreeTableView>
   </children>
</AnchorPane>

控制器

public class StateController implements Initializable {
    private static Map<Long, TreeItem> subdivisions = new HashMap<>();
    private static StateController instance;
    @FXML    private TreeTableColumn<StateEntity, String> tblClmnTitle,...,tblClmnDelete;
    @FXML    private TreeTableView<StateEntity> treeTblState = new TreeTableView<>();
    //Create root element (property setShow = false в FXML)
    private StateEntity root = new StateEntity(0L,"State");
    //Pattern Instance
    public static StateController getInstance() {
        if (instance == null) {
            instance = new StateController();
        }
        return instance;
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        try {
            tblClmnTitle.setCellValueFactory(new TreeItemPropertyValueFactory<>("postName"));
            ...
            tblClmnDelete.setCellValueFactory(new TreeItemPropertyValueFactory<>("delete"));
            treeGreate();
        } catch ....
    }

    public void addChildren(StateEntity state) {
        TreeItem<StateEntity> item = null;
        for (Long key : subdivisions.keySet()) {
            if (key == state.getSubdivisionId()) {
                TreeItem<StateEntity> subdiv = subdivisions.get(key);
                item = new TreeItem<StateEntity>(state);
                subdiv.getChildren().add(item);
            }
        }
    }
    
    private void treeGreate() {
        TreeItem<StateEntity> itemRoot = new TreeItem<StateEntity>(root);
        treeTblState.setRoot(itemRoot);
        //create tree - level 2
        //subdivisions
        for (SubdivisionEntity subdivision : subdivisionDAO.findAll()) {
            StateEntity state = new StateEntity(
                    subdivision.getId(),
                    subdivision.getTitle()
            );
            state.getAdd().setOnAction(new EventHandler<ActionEvent>() {
                @Override public void handle(ActionEvent e) {
                    createScene("Add post", new StateEntity(), subdivision.getId());
                }
            });
            TreeItem<StateEntity> subdiv = new TreeItem<StateEntity>(state);
            itemRoot.getChildren().add(subdiv);
            subdivisions.put(state.getSubdivisionId(), subdiv);
            //posts
            List<StateEntity> childrens = stateDAO.findByIdSubdiv(state.getSubdivisionId());
            if (!childrens.isEmpty()) {
                for (StateEntity child : childrens) {
                    TreeItem<StateEntity> item = new TreeItem<StateEntity>(child);
                    subdiv.getChildren().add(item);
                }
            }

        }
    }

    private void createScene(String title, StateEntity state, Long subdivisionId) {
        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("/views/state-edit.fxml"));
            StateEditController stateEditController = new StateEditController(state, subdivisionId);
            loader.setController(stateEditController);
            Stage stage = new Stage();
            Scene scene = new Scene(loader.load());
            stage.setScene(scene);
            stage.initModality(Modality.APPLICATION_MODAL);
            stage.showAndWait();
        } catch ....
    }
}

第二个窗口


<AnchorPane xmlns="http://javafx.com/javafx/18" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      ...elements...
   </children>
</AnchorPane>

控制器

public class StateEditController implements Initializable {
    ....

    @FXML
    void saveAction(ActionEvent event) {
        currentEntry.setSubdivisionId(subdivisionId);
        currentEntry.setMaxAmountPersonal(cmbBoxMaxAmount.getSelectionModel().getSelectedItem().intValue());
        currentEntry.setMinAmountPersonal(cmbBoxMaxAmount.getSelectionModel().getSelectedItem().intValue());
        currentEntry.setAmplification(tglSwitchAmpl.isSelected());
        currentEntry.setPostId(cmbBoxPost.getSelectionModel().getSelectedItem().getId());
        if (currentEntry.getId() == null) {
            stateDAO.save(currentEntry);
        } else {
            stateDAO.update(currentEntry);
        }
        stateController.addChildren(currentEntry); //call instance metod
    }
    @Override
    public void initialize(URL location, ResourceBundle resources) {
       ....
    }
}

结果

所有内容都成功输入数据库,但关闭窗口时并未更新2.

javafx
1个回答
0
投票

添加项目时,我使用clear方法重绘子元素

public void addChildren(StateEntity state) {
        subdivisions.get(state.getSubdivisionId()).getChildren().clear();
        List<StateEntity> childrens = stateDAO.findByIdSubdiv(state.getSubdivisionId());
        if (!childrens.isEmpty()) {
            for (StateEntity child : childrens) {
                TreeItem<StateEntity> item = new TreeItem<StateEntity>(child);
                subdivisions.get(state.getSubdivisionId()).getChildren().add(item);
            }
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.