3

在处理需要居中复选框列的 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);
            }

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

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

问候, 克里斯玛安迪卡

4

1 回答 1

3

JavaFX Ensemble(javafx 示例)具有您尝试使用的完美代码。另外,他们提供了一种更好的在 a 中使用 aCheckBox的方法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)会将您的控件设置在单元格的中心。

于 2012-11-12T17:42:23.130 回答