TableView JavaFX中的CheckBox

时间:2012-11-10 01:37:18

标签: checkbox tableview javafx-2 centering

在处理需要居中复选框列的tableview时发现问题。我可以创建一个带复选框的列。我还想根据该复选框值在我的模型中设置属性。我用以下代码完成了它:

isCanceledCol.setCellValueFactory(new Callback<CellDataFeatures<TransactionModel,CheckBox>,ObservableValue<CheckBox>>() {

            @Override
            public ObservableValue<CheckBox> call(final CellDataFeatures<TransactionModel, CheckBox> p) {
                CheckBox cb = new CheckBox();
                cb.selectedProperty().addListener(new ChangeListener<Boolean>() {

                    @Override
                    public void changed(ObservableValue<? extends Boolean> ov, Boolean t, Boolean t1) {
                        p.getValue().setIsCanceled(t1.booleanValue());
                    }
                }
                        );
                canceledCB.add(cb);
                return new SimpleObjectProperty(cb);
            }

上面代码的问题是,复选框显示为左对齐。我想让它居中,但我也想保留复选框的更改事件以更改我的模型属性(p.getValue()。setIsCanceled(t1.booleanValue());)。

我真的很感谢你们的帮助。

此致 Chrisma Andhika

1 个答案:

答案 0 :(得分:3)

JavaFX Ensemble(javafx示例)具有您尝试使用的完美代码。此外,他们还提供了一种在CheckBox中使用TableView的更好方法。

重点是TableCell控件使用的范围TableView。要创建CheckBox列,应创建并使用以下列:

//CheckBoxTableCell for creating a CheckBox in a table cell
public static class CheckBoxTableCell<S, T> extends TableCell<S, T> {
    private final CheckBox checkBox;
    private ObservableValue<T> ov;

    public CheckBoxTableCell() {
        this.checkBox = new CheckBox();
        this.checkBox.setAlignment(Pos.CENTER);

        setAlignment(Pos.CENTER);
        setGraphic(checkBox);
    } 

    @Override public void updateItem(T item, boolean empty) {
        super.updateItem(item, empty);
        if (empty) {
            setText(null);
            setGraphic(null);
        } else {
            setGraphic(checkBox);
            if (ov instanceof BooleanProperty) {
                checkBox.selectedProperty().unbindBidirectional((BooleanProperty) ov);
            }
            ov = getTableColumn().getCellObservableValue(getIndex());
            if (ov instanceof BooleanProperty) {
                checkBox.selectedProperty().bindBidirectional((BooleanProperty) ov);
            }
        }
    }
}

setAlignment(Pos.CENTER)会将您的控件设置在单元格的中心。