TableView中的JavaFX三态CheckBox

时间:2015-03-19 15:41:11

标签: checkbox javafx tableview

我想在一个带有bean属性的TableView中绑定一个三态CheckBox,我有一个近似值但只反映了属性更改时复选框中的更改,但我不知道如何反映属性中的更改复选框已更改。 我看了谷歌,但我找不到答案。

    public enum Attending {FALSE, TRUE, UNKNOWN}
    colEp.setCellFactory(new Callback<TableColumn<VentanaExtended, Attending>, TableCell<VentanaExtended, Attending>>() {

        @Override
        public TableCell<VentanaExtended, Attending> call(TableColumn<VentanaExtended, Attending> column) {
            return new TableCell<VentanaExtended, Attending>() {
                final CheckBox checkBox = new CheckBox() {
                    {
                        setAllowIndeterminate(true);
                    }

                };

                @Override
                public void updateItem(Attending item, boolean empty) {
                    super.updateItem(item, empty);
                    if (empty) {
                        setGraphic(null);
                    } else {                            
                        switch (item) {
                            case TRUE:
                                checkBox.setSelected(true);
                                break;
                            case FALSE:
                                checkBox.setSelected(false);
                                break;
                            case UNKNOWN:
                                checkBox.setIndeterminate(true);
                                break;
                        }
                        setGraphic(checkBox);
                    }
                }
            ;
        }
    ;
    }
    });

1 个答案:

答案 0 :(得分:0)

到目前为止,这是我最好的方法,也许有更好的方法,但就目前而言,这对我有用。

final CheckBox checkBox = new CheckBox() {
                {
                    setAllowIndeterminate(true);

                    indeterminateProperty().addListener((obs, oldValue, newValue) -> {
                             ((VentanaExtended) getTableRow().getItem()).epProperty().set(Attending.UNKNOWN);
                    });

                    selectedProperty().addListener((obs, oldValue, newValue) -> {
                             ((VentanaExtended) getTableRow().getItem()).epProperty().set(Attending.FALSE);
                    });
                }

            };

我不得不添加setIndeterminate(false)。

            @Override
            public void updateItem(Estados item, boolean empty) {
                super.updateItem(item, empty);
                if (empty) {
                    setGraphic(null);
                } else {
                    switch (item) {
                        case TRUE:
                            checkBox.setSelected(true);
                            checkBox.setIndeterminate(false);
                            break;
                        case FALSE:
                            checkBox.setSelected(false);
                            checkBox.setIndeterminate(false);
                            break;
                        case UNKNOWN:
                            checkBox.setIndeterminate(true);
                            break;
                    }
                    setGraphic(checkBox);
                }
            }