Вы должны иметь возможность редактировать таблицу, как вы упомянули, editable = true
и добавление фабрики ячеек с текстовым полем, например:
new TableColumn[Person, String] {
text = "First Name"
cellValueFactory = {_.value.firstName}
cellFactory = TextFieldTableCell.forTableColumn()
prefWidth = 180
}
JavaFX Table View Tutorial также предлагает использовать OnEditCommit
. Не уверен, что это действительно необходимо. Вот полный пример, который работает без использования OnEditCommit
:
import scalafx.application.JFXApp
import scalafx.application.JFXApp.PrimaryStage
import scalafx.beans.property.StringProperty
import scalafx.collections.ObservableBuffer
import scalafx.event.ActionEvent
import scalafx.scene.Scene
import scalafx.scene.control.TableColumn._
import scalafx.scene.control.cell.TextFieldTableCell
import scalafx.scene.control.{Button, TableColumn, TableView}
import scalafx.scene.layout.VBox
object EditableTableView extends JFXApp {
class Person(firstName_ : String, lastName_ : String) {
val firstName = new StringProperty(this, "firstName", firstName_)
val lastName = new StringProperty(this, "lastName", lastName_)
firstName.onChange { (_, oldValue, newValue) => println(s"Value changed from `$oldValue` to `$newValue`") }
lastName.onChange { (_, oldValue, newValue) => println(s"Value changed from `$oldValue` to `$newValue`") }
override def toString = firstName() + " " + lastName()
}
val characters = ObservableBuffer[Person](
new Person("Peggy", "Sue"),
new Person("Rocky", "Raccoon")
)
stage = new PrimaryStage {
title = "Editable Table View"
scene = new Scene {
root = new VBox {
children = Seq(
new TableView[Person](characters) {
editable = true
columns ++= List(
new TableColumn[Person, String] {
text = "First Name"
cellValueFactory = {_.value.firstName}
cellFactory = TextFieldTableCell.forTableColumn()
prefWidth = 180
},
new TableColumn[Person, String]() {
text = "Last Name"
cellValueFactory = {_.value.lastName}
cellFactory = TextFieldTableCell.forTableColumn()
prefWidth = 180
}
)
},
new Button {
text = "Print content"
onAction = (ae: ActionEvent) => {
println("Characters:")
characters.foreach(println)
}
}
)
}
}
}
}