Основной вопрос новичка:
Я хочу синхронизировать / связать две таблицы.
Для упрощения примера я использовал два отдельных представления таблиц. Это необходимо сделать с использованием фрагментов и области видимости, что, как я думал, усложнит вопрос, поскольку я застрял на основной проблеме.
Поведение: при нажатии кнопки синхронизации таблицы 1 я хочу, чтобы выбранные данные таблицы 1 были переопределить соответствующие данные таблицы 2. и наоборот
Модель человека:
class Person(firstName: String = "", lastName: String = "") {
val firstNameProperty = SimpleStringProperty(firstName)
var firstName by firstNameProperty
val lastNameProperty = SimpleStringProperty(lastName)
var lastName by lastNameProperty
}
class PersonModel : ItemViewModel<Person>() {
val firstName = bind { item?.firstNameProperty }
val lastName = bind { item?.lastNameProperty }
}
Персональный контроллер (фиктивные данные):
class PersonController : Controller(){
val persons = FXCollections.observableArrayList<Person>()
val newPersons = FXCollections.observableArrayList<Person>()
init {
persons += Person("Dead", "Stark")
persons += Person("Tyrion", "Lannister")
persons += Person("Arya", "Stark")
persons += Person("Daenerys", "Targaryen")
newPersons += Person("Ned", "Stark")
newPersons += Person("Tyrion", "Janitor")
newPersons += Person("Arya", "Stark")
newPersons += Person("Taenerys", "Dargaryen")
}
}
Просмотр списка людей:
class PersonList : View() {
val ctrl: PersonController by inject()
val model : PersonModel by inject()
var personTable : TableView<Person> by singleAssign()
override val root = VBox()
init {
with(root) {
tableview(ctrl.persons) {
personTable = this
column("First Name", Person::firstNameProperty)
column("Last Name", Person::lastNameProperty)
columnResizePolicy = SmartResize.POLICY
}
hbox {
button("Sync") {
setOnAction {
personTable.bindSelected(model)
//model.itemProperty.bind(personTable.selectionModel.selectedItemProperty())
}
}
}
}
}
Просмотр списка другого человека:
class AnotherPersonList : View() {
val model : PersonModel by inject()
val ctrl: PersonController by inject()
override val root = VBox()
var newPersonTable : TableView<Person> by singleAssign()
init {
with(root) {
tableview(ctrl.newPersons) {
newPersonTable = this
column("First Name", Person::firstNameProperty)
column("Last Name", Person::lastNameProperty)
columnResizePolicy = SmartResize.POLICY
}
hbox {
button("Sync") {
setOnAction {
newPersonTable.bindSelected(model)
}
}
}
}
}
}
bindSelected
в обоих. Обратите внимание, что вызовbindSelected
должен вызываться один раз, а не при нажатии на действие. Просто убедитесь, что выбор таблицы обновит модель - не при вызове bindSelection, а при выборе. Не совсем уверен в вашем фактическом использовании, но позвольте мне немного его переписать. - person Edvin Syse   schedule 23.12.2016