2015-05-27 25 views
2

我對Scala和ScalaFX相當陌生,所以我可能不明白這一點。 我的問題:我添加一個節點(f.e. Button)到一個ScalaFX窗格(f.e. VBox)。 當我訪問窗格的子項時,子類型從ScalaFX按鈕更改爲JavaFX Button。JavaFX類型的ScalaFX窗格的孩子?

當我看看ScalaFX的源代碼時,我可以看到所有事情都是由代表完成的。那麼ScalaFX節點會丟失嗎?我認爲從ScalaFX到JavaFX的轉換已經有了一些神奇的東西(對我來說是一個新手)。是否有可能以相反的方式進行隱式轉換?我是否正確使用ScalaFX?

我想穿過一個窗格的所有孩子。當一個孩子來自特殊類型時,我想與這個孩子進行一些操作。現在,我將不得不檢查JavaFX類型並在JavaFX節點上工作,該節點對我來說看起來不像乾淨的代碼。

歡迎任何評論。提前致謝。

我附上了一個運行的例子。

import scalafx.Includes._ 
import scalafx.application.JFXApp 
import scalafx.application.JFXApp.PrimaryStage 
import scalafx.scene.Scene 
import scalafx.scene.control.Button 
import scalafx.scene.layout.VBox 
import scalafx.stage.WindowEvent 

object TestChildren extends JFXApp { 
    stage = new PrimaryStage { 
    val contentPane = new VBox() 
    val b1 = new Button("B1") 
    contentPane.children.add(b1) 
    scene = new Scene (contentPane) 

    println(b1.getClass) 
    println("--") 
    for (child <- contentPane.children) { 
     println(child.getClass) 
    } 
    } 
} 

回答

0

是的,存在隱式轉換。我不知道你正在使用哪個IDE,但是例如IntelliJ 14.1和Scala插件指出了隱式轉換,這是一個非常有用的功能。

在你的情況,

contentPane.children.add(b1) 

是在隱式轉換髮生的線。顯式的形式是

contentPane.children.add(Button.sfxButton2jfx(b1)) 

,其中隱式轉換是一個班輪在scalafx.scene.control.Button

implicit def sfxButton2jfx(v: Button): jfxsc.Button = if (v != null) v.delegate else null 
+0

我使用和IntelliJ,現在能看到的隱式轉換。謝謝。如果孩子是特殊類型/班級,你會怎麼檢查?我迭代子節點並檢查JavaFX類,然後從JavaFX對象中創建一個ScalaFX對象。這個可以嗎?它看起來不像我乾淨的代碼。混合使用JavaFX和ScalaFX。定義從JavaFX到ScalaFX的implcit轉換還是會產生任何不良副作用? – hami

+0

@hami不可否認,我並不瞭解ScalaFX和JavaFX,但它看起來像ScalaFX只是爲JavaFX提供更多的Scala-idiomatic語法。我猜他們大部分是可以互換的,你可以將他們兩個轉換成另一個。但是,我沒有看到任何干淨的代碼違規行爲,但是,正如您已經認識到的那樣,如果沒有適當的工具,轉換可能會造成混淆。關於你的類型檢查:Scala有一個非常強大的靜態類型系統;通常你不需要檢查動態類型。在這種情況下,'contentPane.children'的類型爲'ObservableList [javafx.scene.Node]'... –

+0

...所以不需要檢查動態類型。如果您確實需要了解運行時類型,通常我認爲最簡潔的方法是使用部分函數,​​例如'match'-clause。最後,從'A'到'B'和從'B'到'A'的隱式轉換沒有任何特別的危險:最多應用一個隱式轉換,隱式轉換隻發生在編譯時。 –