javafx TreeTableView未获得更新

时间:2016-04-15 15:46:04

标签: javafx treetableview

我花了几个小时调查一个问题而且无法理解它。我已经找到了this linkthat link,但即使我认为我遵循了那里的建议,我的TreeTableView也不会更新。

我有一个控制器,我在其中使用initialize-Method来设置cell-和cellValue-Factories:

    aktivaValueTreeTableColumn.setCellValueFactory(new TreeItemPropertyValueFactory<>("valueAsString"));
    aktivaValueTreeTableColumn.setCellFactory(Helper.getPaddingCallbackFactory());
    aktivaValueTreeTableColumn.setStyle(StyleHelper.alignTextRight());
    aktivaActionColumn.setStyle(StyleHelper.alignTextRight());


    aktivaActionColumn.setCellValueFactory(new Callback<TreeTableColumn.CellDataFeatures<BalanceSheetItem, String>, ObservableValue<String>>() {
        @Override
        public ObservableValue<String> call(TreeTableColumn.CellDataFeatures<BalanceSheetItem, String> param) {
            if (param == null || param.getValue() == null || param.getValue().getValue() == null || param.getValue().getValue().getAccount() == null) {
                return new SimpleStringProperty(StringUtils.EMPTY);
            }
            return param.getValue().getValue().getAccount().getAccountNumberSimpleString();
        }

    });

    // create a cell value factory with an add button for each row in the table.
    aktivaActionColumn.setCellFactory(
            new Callback<TreeTableColumn<BalanceSheetItem, String>, TreeTableCell<BalanceSheetItem, String>>() {
        @Override
        public TreeTableCell<BalanceSheetItem, String> call(
                TreeTableColumn<BalanceSheetItem, String> param) {
            return new ShowFinancialBookingsCell();
        }
    });

    refreshTreeTableViews();

在refreshTreeTableViews()中,我向TreeTableView添加了几个Items。对于TreeItemPropertyValueFactories,这工作正常,一切都可以在TreeTableView出现时正确呈现。但是,ShowFinancialBookingsCell()所在的单元格最初不会被渲染。当我再次向下滚动时,TreeTableView中隐藏并再次出现的部分正确显示了ShowFinancialBookingsCell()&#39>。

由于这个原因,我尝试在refreshTreeTableViews() - Function之后刷新TreeTableView,但这并没有改变任何东西。

ShowFinancialBookingsCell的代码是:

public class ShowFinancialBookingsCell extends TreeTableCell<BalanceSheetItem, String> {

@Override
protected void updateItem(String accountNo, boolean empty) {
    super.updateItem(accountNo, empty); //To change body of generated methods, choose Tools | Templates.

    if (isEmpty()) {
        setGraphic(null);
        setText(null);
    } else if (accountNo != null && StringUtils.isNotBlank(accountNo)) {
        refreshView(accountNo);
    } else {
        // If this is the root we just display the text.
        setGraphic(null);
        setText(null);
    }
}

private void refreshView(String account) {
    Button button = new Button();
    HBox hbox = new HBox();
    button.setPrefWidth(40);
    hbox.setPadding(new Insets(0, 0, 0, 10));
    button.setGraphic(new ImageView(ImageProvider.getImageForName(ImageProvider.OPEN_SYMBOL)));
    button.setOnAction(new EventHandler<javafx.event.ActionEvent>() {
        @Override
        public void handle(javafx.event.ActionEvent event) {
            List<Account> a = AccountManagerImpl.getInstance().findByAccountNumber(account);
            if (CollectionUtils.isNotEmpty(a)) {
                try {
                    WindowHelper.showObjectListDisplay(new ArrayList<>(FinanceManagerImpl.getInstance().findAllForAccount(a.get(0))));
                } catch (IOException ex) {
                    Logger.getLogger(ShowFinancialBookingsCell.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    });
    hbox.getChildren().add(button);
    this.getChildren().clear();
    this.getChildren().add(hbox);
}

}

有人知道我在自定义单元格中做错了什么吗?其他单元格(具有TreeItemPropertyValueFactory)渲染得很好。

1 个答案:

答案 0 :(得分:1)

您应该设置图形:

,而不是将子项添加到单元格
hbox.getChildren().add(button);
// this.getChildren().clear();
// this.getChildren().add(hbox);
this.setGraphic(hbox);

单元格可能会管理自己的布局,并且可能会在执行布局时构建其子节点列表,以显示文本和图形。

相关问题