2017-07-17 38 views
1

[编辑]:我设法绕过我的问题,但我仍然在寻找更好的解决方案。我的解决方案发布如下。CustomTreeItem使用节点而不是字符串

我对Scala以及ScalaFX都比较陌生,但之前我曾使用过JavaFX。我正在尝试创建一个使用HBoxes的自定义行的TreeView。

这是我想创造什么: Image displaying a TreeView

正如你所看到的TreeView控件同时使用文本字符串,而且节点(状态栏,标签,超链接/按钮)。当我将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函数以返回一个空字符串,并将一个窗格作为图形节点添加到了TreeItem中。这个窗格然后被我想要在行中的所有节点填充。

+0

请不要编辑问题的解决方案;相反,请在下面发布答案。 – Mithrandir

+0

另有说法。 [图片](http://i.imgur.com/i6rnz8K) – lindbergan

+0

这是关于这个问题的详细信息 - 比如,最初没有提供的代码。如果您有实际的答案,请发布答案。谢谢 :) – Mithrandir

回答

0

这是一个解决方案,但它仍然不是一个好的解决方案,所以如果有人感兴趣,我想帮助一下。

解决方案:因为如果值为空,TreeView不显示TreeItem的图形,我随后覆盖toString函数以返回空字符串。现在显示图形,然后出现一个空字符串“”,而不是不可见的。我将一个窗格添加为TreeItem的图形节点。这个窗格然后被我想要在行中的所有节点填充。

相关问题