Как я могу добавить флажок в таблицу, которая читает и записывает свойство объекта, которое оно представляет в JavaFX - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть таблица, в которой перечислены объекты типа Bot, которые имеют имя и isOn свойства, которые я хочу перечислить:

private SimpleStringProperty name;
private boolean isOn;

Логическое значение isOn, я хочу, чтобы его читали из флажка, а также редактировали из этого флажка

До сих пор мне удавалось добавить флажок в столбец в моей таблице для каждой строки, но он чисто визуальный (то есть он не привязан к члену Bot isOn).

Как сделать так, чтобы флажок читался и записывался от и для этого члена 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);
        }
    }
}

1 Ответ

0 голосов
/ 26 апреля 2018

Вам необходимо снять флажок, если ячейка становится пустой.Кроме того, вам нужно обновить значение, когда пользователь взаимодействует с 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());
    }
});
...