javafx TreeTableView 没有得到更新
javafx TreeTableView not getting Updated
我花了几个小时调查一个问题,但就是无法解决这个问题。我已经找到 this link and ,但即使我认为我遵循了那里的建议,我的 TreeTableView 也没有得到更新。
我有一个控制器,我在其中使用初始化方法设置单元格和单元格值工厂:
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。对于 TreeItemPropertyValueFactories 这工作正常,一切都在 TreeTableView 显示时正确呈现。但是,最初不会呈现 ShowFinancialBookingsCell() 所在的单元格。当我再次向下和向上滚动时,被隐藏并再次出现的 TreeTableView 部分正确显示了 ShowFinancialBookingsCell()。
因此,我尝试在 refreshTreeTableViews() 函数之后刷新 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)呈现得很好。
您应该设置图形而不是向单元格添加子项:
hbox.getChildren().add(button);
// this.getChildren().clear();
// this.getChildren().add(hbox);
this.setGraphic(hbox);
单元格可能会管理自己的布局,并且可能会在执行布局时构建其子节点列表,以显示文本和图形。
我花了几个小时调查一个问题,但就是无法解决这个问题。我已经找到 this link and
我有一个控制器,我在其中使用初始化方法设置单元格和单元格值工厂:
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。对于 TreeItemPropertyValueFactories 这工作正常,一切都在 TreeTableView 显示时正确呈现。但是,最初不会呈现 ShowFinancialBookingsCell() 所在的单元格。当我再次向下和向上滚动时,被隐藏并再次出现的 TreeTableView 部分正确显示了 ShowFinancialBookingsCell()。
因此,我尝试在 refreshTreeTableViews() 函数之后刷新 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)呈现得很好。
您应该设置图形而不是向单元格添加子项:
hbox.getChildren().add(button);
// this.getChildren().clear();
// this.getChildren().add(hbox);
this.setGraphic(hbox);
单元格可能会管理自己的布局,并且可能会在执行布局时构建其子节点列表,以显示文本和图形。