2017-07-17 37 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的圖形節點。這個窗格然後被我想要在行中的所有節點填充。

相關問題