在我的tableview类模型中,我有一些java.util.Map属性。我的两个表列必须填充字符串值,这些值在使用Map属性进行一些计算后得到。此外,在某些情况下,这两个列可以包含按钮(不是字符串)。现在我试图通过%columnName%.setCellFactory(Callback callback)方法更新我的表。 附:我的解决方案在某种意义上是成功的更新后,当我双击一个tablecell时 - 它会更新。所以我的tableview知道我的单元格必须包含什么值。
UPD:我的模型的一部分:
class AppServerParameter{
private Map<String, Map<Integer, AppServerParameterValue>> actualValues;
public Map<String, Map<Integer, AppServerParameterValue>> getActualValues() {
return actualValues;
}
public void setActualValues(Map<String, Map<Integer, AppServerParameterValue>> actualValues) {
this.actualValues = actualValues;
}
}
和setCellFactory方法:
value = new TableColumn("Value");
value.setCellFactory(new Callback<TableColumn, TableCell>() {
@Override
public TableCell call(TableColumn param) {
return new TableCell() {
@Override
protected void updateItem(Object item, boolean empty) {
super.updateItem(item, empty);
try {
if (getTableRow() != null && getTableRow().getIndex() >= 0) {
if(getIndex()>getTableView().getItems().size()-1) return;
final AppServerParameter appServerParameter = (AppServerParameter) getTableView().getItems().get(getTableRow().getIndex());
if (appServerParameter.isLevelled()==null) {
setGraphic(new Label("Not received"));
} else if (appServerParameter.isLevelled()) {
setGraphic(new Label(appServerParameter.getVeryFirstValue().getValue()));
} else {
Button button = new Button("Different values");
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
Stage modal = new Stage(StageStyle.DECORATED);
modal.setTitle(appServerParameter.getName() + " values");
modal.setScene(new DifferencesWindow(new ScrollPane(), 500, 500, appServerParameter.getActualValues()));
modal.show();
}
});
setGraphic(button);
}
}
} catch (IndexOutOfBoundsException e) {
e.printStackTrace();
}
}
};
}
});
UPD2:另外,我正在尝试更新我的表格。此方法适用于JavaFX8,但不适用于JavaFX 2.2:
TableView<AppServerParameter> tableView = (TableView) node;
final List<AppServerParameter> items=new LinkedList<AppServerParameter>();
FXCollections.copy(tableView.getItems(), items);
tableView.getItems().removeAll();
tableView.getItems().addAll(items);