我是 ScalaFx 的新手,想创建一个 TableView,其中包含一个带有CheckBox
s 的可编辑布尔列(以及带有 TextFields 的可编辑 String 和 Int 列)。我想我需要使用CheckBoxTableCell
. 我正在使用 JDK 7u25、ScalaFX 1.0.0-M4/M5 和 Scala 2.10.2-final。(我不完全确定 ScalaFX 版本,但肯定至少是 1.0.0-M5。无论如何它是 Jarek 于 8 月 1 日上传到https://oss.sonatype.org/index.html#nexus的快照-search;quick~scalafx . Jarek 只为 Scala 2.9.x 编译,但我已经下载了他的源代码并重新编译了它。)
我已经设法基于ScalaFX TableView 中的整数列,http ://foofighter2146.blogspot.com/2013/06/tutorial-scalafx-slick.html 和 scalafx-demo: SimpleTableView 让它工作了一半。但是,我不能在 TableView 中使用 CheckBox 并使用它们的值。相反,我只能让它以我需要输入“true”或“false”来编辑表中的值的方式工作。
到目前为止,这是我设法完成的工作:
class Person(firstName_ : String, age_ : Int, cool_ : Boolean) {
val name = new StringProperty(this, "Name", firstName_)
val age = new IntegerProperty(this, "Age", age_)
val cool = new ObjectProperty(this, "Cool", cool)
}
object SimpleEditableTableView extends JFXApp {
val characters = ObservableBuffer[Person](
new Person("Peggy", 45, false),
new Person("Rocky", 43, true)
)
stage = new PrimaryStage {
title = "Simple Ediatble Table View"
scene = new Scene {
content = new TableView[Person](characters) {
editable = true
columns ++= List(
new TableColumn[Person, String] {
text = "Name"
cellValueFactory = {_.value.name}
cellFactory = _ => new TextFieldTableCell[Person, String] (new DefaultStringConverter())
onEditCommit = (evt: CellEditEvent[Person, String]) => {
val person = evt.rowValue
val newName = evt.newValue
println("Here we'll typically save the data. New name = "+newName)
}
editable = true
prefWidth = 180
},
new TableColumn[Person, Int] {
text = "Name"
cellValueFactory = {_.value.age}
cellFactory = _ => new TextFieldTableCell[Person, Int] (new IntStringConverter())
onEditCommit = (evt: CellEditEvent[Person, Int]) => {
val person = evt.rowValue
val newAge = evt.newAge
println("Here we'll typically save the data. New age = "+newAge)
}
editable = true
prefWidth = 180
},
new TableColumn[Person, Boolean] {
text = "Cool"
cellValueFactory = {_.value.cool}
cellFactory = _ => new TextFieldTableCell[Person, Boolean] (new BooleanStringConverter())
onEditCommit = (evt: CellEditEvent[Person, Boolean]) => {
val person = evt.rowValue
val newCool = evt.newCool
println("Here we'll typically save the data. New cool = "+newCool)
}
editable = true
prefWidth = 180
}
)
}
}
}
}
对于“酷”表列,我想替换
cellFactory = _ => new TextFieldTableCell[Person, Boolean] (new BooleanStringConverter())
和
val selectedProperty: Int => ObservableValue[Boolean, java.lang.Boolean] = {rowNum: Int => model.characters(rowNum).cool}
cellFactory = column => CheckBoxTableCell.forTableColumn[Person, Boolean](selectedProperty)
为了在 TableView 中获得漂亮的 CheckBox(目前,我得到 TextFields,我必须在其中输入“true”或“false”)。但是,这给了我(明显的)错误:
type mismatch; found : scalafx.beans.property.ObjectProperty[scala.Boolean] required: scalafx.beans.value.ObservableValue[scala.Boolean,java.lang.Boolean]
如果我改变
val selectedProperty: Int => ObservableValue[Boolean, java.lang.Boolean] = {rowNum: Int => model.characters(rowNum).cool}
到 val selectedProperty = {rowNum: Int => model.characters(rowNum).cool}
我收到一条错误消息,基本上归结为CheckBoxTableCell.forTableColumn[Person, Boolean](selectedProperty)
要求selectedProperty
是 type的事实,Int => ObservableValue[Boolean, java.lang.Boolean]
而不是Int => ObjectProperty[Boolean]