Доступ к значению CheckBox в TableView - PullRequest
1 голос
/ 11 июля 2019

У меня проблемы с получением логического значения того, установлен ли флажок в tableView for JavaFX или нет.

(ссылка на изображение) https://i.imgur.com/pIWDcfI.png

По какой-то причине, когда я получаюCellObservableValue (), чтобы получить CheckBox с индексом 1, в результате я получаю нулевое значение.

//From SceneBuilder/JavaFX file
<TableColumn fx:id="labelColumn" prefWidth="112.57145690917969" text="Use 
as Label" />


//Setting Up Table, which displays everything correctly 
TableColumn<Integer,CheckBox>  labelColumn = (TableColumn<Integer, 
CheckBox>) elements.get("labelColumn");
labelColumn.setCellFactory(data -> new CheckBoxTableCell<>());
monitorTable.setEditable(true);



//Trying to Access, which gives null pointer exception
CheckBox cb = (CheckBox) labelColumn.getCellObservableValue(1);
System.out.println(cb.isSelected());

1 Ответ

3 голосов
/ 11 июля 2019

Этот метод возвращает null, если не установлено cellValueFactory. Кроме того, у вас должна быть модель для удержания этого состояния - TableView - это просто представление. В отличие от TableViewSelectionModel, который представляет элементы, выбранные исключительно в контексте самого TableView, столбец, содержащий CheckBox es, представляет «логическое состояние» свойства модели . Например:

public class ToDoTask {

    private final StringProperty name = new SimpleStringProperty(this, "name");
    private final BooleanProperty complete = new SimpleBooleanProperty(this, "complete");

    // constructors, getters, setters, and property-getters omitted for brevity
}

A TableView для отображения этого класса можно настроить следующим образом:

TableView<ToDoTask> table = new TableView<>();
table.setItems(...);

TableColumn<ToDoTask, String> nameCol = new TableColumn<>("Name");
nameCol.setCellValueFactory(features -> features.getValue().nameProperty());
table.getColumns().add(nameCol);

TableColumn<ToDoTask, Boolean> completeCol = new TableColumn<>("Complete");
completeCol.setCellValueFactory(features -> features.getValue().completeProperty());
completeCol.setCellFactory(CheckBoxTableCell.forTableColumn(completeCol));
table.getColumns().add(completeCol);

Затем вы запросите, выполнена ли задача, обратившись к модели:

table.getItems().get(...).isComplete();

Другой вариант настройки cellValueFactory состоит в том, чтобы зарегистрировать Callback на самих CheckBoxTableCell. См CheckBoxTableCell#forTableColumn(Callback).


Также обратите внимание, что getCellObservableValue() возвращает ObservableValue. A CheckBox не является ObservableValue. Если бы вы не получили null, вы бы получили ClassCastException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...