Задать вопрос
@gubber

JavaFx. Возможно ли сделать редактируемую ячейку без кода?

Сожно ли сделать корректно редактируемую ячейку в таблице без использования кода?
У меня есть класс модели:
class DuplicateFileInfo(var id: Long, var path: String, var editableField: String?) {}


И есть таблица для отображения
<TableView AnchorPane.bottomAnchor="50.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"
                editable="true"
                layoutX="121.0" layoutY="6.0" fx:id="duplicatesList">
    <columns>
        <TableColumn prefWidth="300.0" text="%file.filename" fx:id="fileNameColumn" editable="false">
            <cellValueFactory>
                <PropertyValueFactory property="path" />
            </cellValueFactory>
        </TableColumn>
        <TableColumn prefWidth="150.0" text="%file.EditableField" fx:id="editableColumn">
            <cellValueFactory>
                <PropertyValueFactory property="editableField" />
            </cellValueFactory>
            <cellFactory>
                <TextFieldTableCell fx:factory="forTableColumn" />
            </cellFactory>
        </TableColumn>
    </columns>
</TableView>


Сейчас получается, что у меня корректно отбражается значение поля editableField. А так же колонка является редактируемой. Но, результаты редактирования не попадают в исходный объект.
Можно ли без написания кода, добиться того, чтобы результаты редактирования попадали в исходный объект модели?
Возможно надо переписать класс модели, этот вариант тоже подойдёт. Не хочется для каждой колонки в коде писать CellFactory.
  • Вопрос задан
  • 561 просмотр
Подписаться 2 Оценить Комментировать
Решения вопроса 1
@gubber Автор вопроса
Всё дело в классе модели. Он должен соответствовать PropertyPattern для JavaFx.
Рабочий класс модели, с которым у меня получилось добиться результата выглядит следующим образом
class DuplicateFileInfo(id: Long, path: String, shouldBeDeleted: Boolean) {

    private val id: LongProperty
    private val path: StringProperty
    private val shouldBeDeleted: BooleanProperty

    init {
        this.id = SimpleLongProperty(id)
        this.path = SimpleStringProperty(path)
        this.shouldBeDeleted = SimpleBooleanProperty(shouldBeDeleted)
    }

    fun getId(): Long {
        return id.get()
    }

    fun idProperty(): LongProperty {
        return id
    }

    fun setId(id: Long) {
        this.id.set(id)
    }

    fun getPath(): String {
        return path.get()
    }

    fun pathProperty(): StringProperty {
        return path
    }

    fun setPath(path: String) {
        this.path.set(path)
    }

    var isShouldBeDeleted: Boolean
        get() = shouldBeDeleted.get()
        set(shouldBeDeleted) = this.shouldBeDeleted.set(shouldBeDeleted)

    fun shouldBeDeletedProperty(): BooleanProperty {
        return shouldBeDeleted
    }

    override fun toString(): String {
        val sb = StringBuffer("DuplicateFileInfo{")
        sb.append("id=").append(id.get())
        sb.append(", path=").append(path.get())
        sb.append(", shouldBeDeleted=").append(shouldBeDeleted.get())
        sb.append('}')
        return sb.toString()
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы