CustomTreeItem 使用节点而不是 String
CustomTreeItem using nodes instead of String
[编辑]:我设法解决了我的问题,但我仍在寻找更好的解决方案。我的解决方案发布在下面。
我对 Scala 和 ScalaFX 都比较陌生,但我以前使用过 JavaFX。我正在尝试创建一个带有使用 HBoxes 的自定义行的 TreeView。
这就是我想要创建的:
Image displaying a TreeView
如您所见,TreeView 既使用文本作为字符串,也使用节点(状态栏、标签、hyperlinks/buttons)。当我将 TreeItem 的值设置为节点时,它使用 toString 函数打印字符串表示,但我希望它显示实际节点。
String representation of the Node
我知道我可以覆盖 toString 函数,但我没有使用它,因为我希望显示节点,而不仅仅是文本。
这是我整理的示例代码:
import scalafx.application.JFXApp
import scalafx.application.JFXApp.PrimaryStage
import scalafx.collections.ObservableBuffer
import scalafx.scene.{Scene}
import scalafx.scene.control.{TreeItem, TreeView}
import scalafx.scene.layout.{BorderPane, HBox}
object Launcher extends JFXApp {
case class Picture(path : String, fileSize : Double, isRoot : Boolean,
picChildren : Seq[Picture])
case class PictureRow(picture: Picture) extends HBox
val childList = Seq(
new Picture("/Users/lindberg/Desktop/download.jpeg", 1.4, isRoot = false, Nil),
new Picture("/Users/lindberg/Desktop/image5.jpeg", 0.5, isRoot = false, Nil)
)
val rootList = Seq(
new Picture("/Users/lindberg/Desktop/", 0, isRoot = true, childList)
)
val treeView = new TreeView[PictureRow]() {
root = new TreeItem[PictureRow]() {
children = ObservableBuffer(rootList.map(n => makeTreeItem(n)))
expanded = true
}
showRoot = false
}
val scene = new Scene(800, 400)
scene.root = new BorderPane {
center = treeView
}
stage = new PrimaryStage()
stage.scene = scene
def makeTreeItem(picture : Picture): TreeItem[PictureRow] = {
val item = new TreeItem[PictureRow]() {
children = ObservableBuffer(picture.picChildren.map(n => makeTreeItem(n)))
expanded = true
value = PictureRow(picture)
}
item
}
}
[编辑]:这是一个解决问题的解决方案,但它仍然不是一个好的解决方案,所以如果有人感兴趣,我希望得到一些帮助。
解决方法:
我将 toString 函数重写为 return 一个空字符串,并将一个窗格作为图形节点添加到 TreeItem。然后,此窗格中充满了我希望位于该行中的所有节点。
这是一个解决问题的解决方案,但它仍然不是一个好的解决方案,所以如果有人感兴趣,我希望得到一些帮助。
解决方案:因为如果值为 null,TreeView 不会显示 TreeItem 的图形,所以我将 toString 函数重写为 return 一个空字符串。现在显示了图形,之后有一个空字符串“”而不是不可见的。我向 TreeItem 添加了一个 Pane 作为图形节点。然后,此窗格中充满了我希望位于该行中的所有节点。
[编辑]:我设法解决了我的问题,但我仍在寻找更好的解决方案。我的解决方案发布在下面。
我对 Scala 和 ScalaFX 都比较陌生,但我以前使用过 JavaFX。我正在尝试创建一个带有使用 HBoxes 的自定义行的 TreeView。
这就是我想要创建的: Image displaying a TreeView
如您所见,TreeView 既使用文本作为字符串,也使用节点(状态栏、标签、hyperlinks/buttons)。当我将 TreeItem 的值设置为节点时,它使用 toString 函数打印字符串表示,但我希望它显示实际节点。
String representation of the Node
我知道我可以覆盖 toString 函数,但我没有使用它,因为我希望显示节点,而不仅仅是文本。
这是我整理的示例代码:
import scalafx.application.JFXApp
import scalafx.application.JFXApp.PrimaryStage
import scalafx.collections.ObservableBuffer
import scalafx.scene.{Scene}
import scalafx.scene.control.{TreeItem, TreeView}
import scalafx.scene.layout.{BorderPane, HBox}
object Launcher extends JFXApp {
case class Picture(path : String, fileSize : Double, isRoot : Boolean,
picChildren : Seq[Picture])
case class PictureRow(picture: Picture) extends HBox
val childList = Seq(
new Picture("/Users/lindberg/Desktop/download.jpeg", 1.4, isRoot = false, Nil),
new Picture("/Users/lindberg/Desktop/image5.jpeg", 0.5, isRoot = false, Nil)
)
val rootList = Seq(
new Picture("/Users/lindberg/Desktop/", 0, isRoot = true, childList)
)
val treeView = new TreeView[PictureRow]() {
root = new TreeItem[PictureRow]() {
children = ObservableBuffer(rootList.map(n => makeTreeItem(n)))
expanded = true
}
showRoot = false
}
val scene = new Scene(800, 400)
scene.root = new BorderPane {
center = treeView
}
stage = new PrimaryStage()
stage.scene = scene
def makeTreeItem(picture : Picture): TreeItem[PictureRow] = {
val item = new TreeItem[PictureRow]() {
children = ObservableBuffer(picture.picChildren.map(n => makeTreeItem(n)))
expanded = true
value = PictureRow(picture)
}
item
}
}
[编辑]:这是一个解决问题的解决方案,但它仍然不是一个好的解决方案,所以如果有人感兴趣,我希望得到一些帮助。
解决方法: 我将 toString 函数重写为 return 一个空字符串,并将一个窗格作为图形节点添加到 TreeItem。然后,此窗格中充满了我希望位于该行中的所有节点。
这是一个解决问题的解决方案,但它仍然不是一个好的解决方案,所以如果有人感兴趣,我希望得到一些帮助。
解决方案:因为如果值为 null,TreeView 不会显示 TreeItem 的图形,所以我将 toString 函数重写为 return 一个空字符串。现在显示了图形,之后有一个空字符串“”而不是不可见的。我向 TreeItem 添加了一个 Pane 作为图形节点。然后,此窗格中充满了我希望位于该行中的所有节点。