通过setCellFactory使用map作为两列的数据更新tableview行

时间:2015-05-05 13:52:30

标签: javafx javafx-2 tableview

在我的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);

0 个答案:

没有答案