如何将复选框添加到读取和写入Javafx中代表的对象属性的表中



我有一个表格列出了Bot的对象,该对象具有我要列出的名称和isOn属性:

private SimpleStringProperty name;
private boolean isOn;

布尔伊森,我想从复选框中阅读,也可以从该复选框中进行编辑

到目前为止,我已经能够在每行的表中的列中添加一个复选框,但它纯粹是视觉的(即,它与BotisOn成员无关(。

如何将复选框从Bot的此成员进行读写?

这是我的代码完全处理表:

ObservableList<Bot> bots = FXCollections.observableArrayList();
@FXML
private TableView<Bot> botTable;
@FXML
private TableColumn<Bot, String> nameColumn;
@FXML
private TableColumn<Bot, Boolean> statusColumn;
public void initialize(URL location, ResourceBundle resources){
    nameColumn.setCellValueFactory(new PropertyValueFactory<Bot, String>("name"));
    statusColumn.setCellValueFactory(new PropertyValueFactory<Bot, Boolean>("on"));
    statusColumn.setSortable(false);
    statusColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Bot, Boolean>, ObservableValue<Boolean>>(){
        @Override public ObservableValue<Boolean> call(TableColumn.CellDataFeatures<Bot, Boolean> features) {
            return new SimpleBooleanProperty(features.getValue() != null);
        }
    });
    // create a cell value factory with an add button for each row in the table.
    statusColumn.setCellFactory(new Callback<TableColumn<Bot, Boolean>, TableCell<Bot, Boolean>>() {
        @Override public TableCell<Bot, Boolean> call(TableColumn<Bot, Boolean> personBooleanTableColumn) {
            return new AddBotCell(/*stage, botTable*/);
        }
    });
    botTable.setItems(bots);
}
/** A table cell containing a button for adding a new person. */
private class AddBotCell extends TableCell<Bot, Boolean> {
    // a checkbox for adding a new bot.
    final CheckBox checkbox = new CheckBox();
    // pads and centers the add button in the cell.
    final StackPane paddedCheckBox = new StackPane();
    AddBotCell(/*final Stage stage, final TableView table*/) {
        paddedCheckBox.setPadding(new Insets(3));
        paddedCheckBox.getChildren().add(checkbox);
        checkbox.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
            }
        });
    }
    /** places an add checkbox in the row only if the row is not empty. */
    @Override protected void updateItem(Boolean item, boolean empty) {
        super.updateItem(item, empty);
        if (!empty) {
            setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
            setGraphic(checkbox);
        }
    }
}

如果单元格为空,则需要删除复选框。此外,当用户与CheckBox交互时,您需要更新值。这是从听众到selected属性的更好的方法:

private class AddBotCell extends TableCell<Bot, Boolean> {
    // a button for adding a new person.
    final CheckBox checkbox = new CheckBox();
    // pads and centers the add button in the cell.
    final StackPane paddedCheckBox = new StackPane();
    // records the y pos of the last button press so that the add person dialog can be shown next to the cell.
    final DoubleProperty buttonY = new SimpleDoubleProperty();
    private boolean updating = false;
    AddBotCell(/*final Stage stage, final TableView table*/) {
        setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
        paddedCheckBox.setPadding(new Insets(3));
        paddedCheckBox.getChildren().add(checkbox);
        checkbox.selectedProperty().addListener((o, oldValue, newValue) -> {
            if (!updating) {
                updating = true;
                ((Bot)getTableRow().getItem()).setIsOn(newValue);
                updating = false;
            }
        });
    }
    /** places an add button in the row only if the row is not empty. */
    @Override protected void updateItem(Boolean item, boolean empty) {
        super.updateItem(item, empty);
        if (empty || item == null) {
            setGraphic(null);
        } else {
            setGraphic(paddedCheckBox);
            updating = true;
            checkbox.setSelected(item);
            updating = false;
        }
    }
}

您的cellValueFactory也应使用属性的值。

statusColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Bot, Boolean>, ObservableValue<Boolean>>(){
    @Override public ObservableValue<Boolean> call(TableColumn.CellDataFeatures<Bot, Boolean> features) {
        return new SimpleBooleanProperty(features.getValue().isIsOn());
    }
});

最新更新