JavaFX TableView с простой моделью xml - PullRequest
0 голосов
/ 19 февраля 2019

Для настройки я использую простой xml.Я также использую эту модель для TableView.Моя проблема с использованием логического.TableView нуждается в BooleanProperty, но простой xml не может получить доступ к этому объекту, очевидно.Как я могу объединить это без записи большого кода?

Модель

@Root(name="scriptdata")
@Order(elements={"title", "active"})
public class ScriptData {
    @Element (required=true)
    private String title;
    @Element (required=false)
    private BooleanProperty active;

    /**
     *
     * @param title
     * @param active
     */
     public ScriptData() {
        this.active = new SimpleBooleanProperty(active);
     }


    public boolean isActive() {
        return active.getValue();
    }

    public void setActive(boolean active) {
        this.active.set(active);
    }

CellFactory

modulActiveColumn.setCellValueFactory(new PropertyValueFactory<>("active"));
modulActiveColumn.setCellFactory(CheckBoxTableCell.forTableColumn(modulActiveColumn));
modulActiveColumn.setOnEditCommit((EventHandler<CellEditEvent>) t -> {
    ((ScriptData) t.getTableView().getItems().get(
      t.getTablePosition().getRow())
      ).setActive((boolean) t.getNewValue());
}

1 Ответ

0 голосов
/ 19 февраля 2019

Моя проблема - использование логического значения.TableView требуется BooleanProperty

Вы не правы.На самом деле TableView никогда не получает доступа к объекту BooleanProperty, хранящемуся в поле active его элементов.

PropertyValueFactory использует отражение для

  1. Доступ к свойствуобъект, вызывая метод с параметром конструктора, сцепленным с "Property".(Этот метод будет называться activeProperty() в вашем случае.)
  2. Если вышеупомянутое не работает, оно оборачивает значение, возвращаемое получателем для свойства в ObservableValue.(Имя получателя в этом случае getActive() или isActive).

В вашем случае cellValueFactory делает что-то похожее на следующую фабрику

modulActiveColumn.setCellValueFactory(cellData -> new SimpleBooleanProperty(cellData.getValue().isActive()));

Использование поля boolean для хранения данных дает точно такой же результат в вашем случае.Недостатком этого подхода является то, что программные обновления свойства не запускают обновление TableView, и изменения необходимо обрабатывать вручную.

@Root(name="scriptdata")
@Order(elements={"title", "active"})
public class ScriptData {
    @Element (required=true)
    private String title;
    @Element (required=false)
    private boolean active;

    /**
     *
     * @param title
     * @param active
     */
    public ScriptData() {
    }

    public boolean isActive() {
        return active;
    }

    public void setActive(boolean active) {
        this.active = active;
    }
}
...