Checkbox单元工厂+ JavaFX中的Tableview

时间:2012-09-24 19:28:44

标签: java tableview javafx checkbox

我正在为我的soap服务编写一个JavaFX客户端,而我的fxml页面必须包含一个可完全编辑的TableView,它由Product-class实体组成。我的表现在由2个文本列和一个组成,其中包含双值。我想在其单元格中添加一个包含CheckBox项目的选择列。使用Ensemble演示应用程序我扩展了一个Cell类以使用CheckBoxes:

public class CheckBoxCell<S, T> extends TableCell<S, T> {

private final CheckBox checkBox;
private ObservableValue<T> ov;

public CheckBoxCell() {
    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);
        }
    }
}

@Override
public void startEdit() {
    super.startEdit();
    if (isEmpty()) {
        return;
    }
    checkBox.setDisable(false);
    checkBox.requestFocus();
}

@Override
public void cancelEdit() {
    super.cancelEdit();
    checkBox.setDisable(true);
}
}

然后在fxml视图中控制器类我为requed TableColumn设置了一个cellFactory:

private Callback<TableColumn, TableCell> createCheckBoxCellFactory() {
    Callback<TableColumn, TableCell> cellFactory = new Callback<TableColumn, TableCell>  () {
        @Override
        public TableCell call(TableColumn p) {
            return new CheckBoxCell();
        }
    };
    return cellFactory;
}

...
products_table_remove.setCellFactory(createCheckBoxCellFactory());

我的问题是:

1)如果我有

,如何使用PropertyValueFactory用未经检查的CheckBox填充此列

private final ObservableList <Boolean> productsToRemove= FXCollections.observableArrayList();

由Boolean.FALSE值组成,然后创建视图。 (TableView包含没有布尔属性的Product类(只有3个String和一个Double属性))?

2)我可以使用EventHandler获取包含所选行的Product对象:

private void setProductDescColumnCellHandler() {
    products_table_remove.setOnEditCommit(new EventHandler() {
        @Override
        public void handle(CellEditEvent t) {
        ...

我在Entites中看到很多例子,它们都有一个布尔字段。在我的例子中,我不想在jax-ws生成的类中添加布尔字段。

1 个答案:

答案 0 :(得分:3)

1)可以使用预定义的班级javafx.scene.control.cell.CheckBoxTableCell来代替你的。

2)为了向现有实例添加信息,我建议继承+委派,为每个 data 实例,实例化一个 view 实例,该实例可用于提供TableView :

class ProductV extends Product {

   ProductV( Product product ) {
      this.product = product;
   }

   final Product         product;
   final BooleanProperty delected = new SimpleBooleanProperty( false );
}