我對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)
}
}
}
我使用和IntelliJ,現在能看到的隱式轉換。謝謝。如果孩子是特殊類型/班級,你會怎麼檢查?我迭代子節點並檢查JavaFX類,然後從JavaFX對象中創建一個ScalaFX對象。這個可以嗎?它看起來不像我乾淨的代碼。混合使用JavaFX和ScalaFX。定義從JavaFX到ScalaFX的implcit轉換還是會產生任何不良副作用? – hami
@hami不可否認,我並不瞭解ScalaFX和JavaFX,但它看起來像ScalaFX只是爲JavaFX提供更多的Scala-idiomatic語法。我猜他們大部分是可以互換的,你可以將他們兩個轉換成另一個。但是,我沒有看到任何干淨的代碼違規行爲,但是,正如您已經認識到的那樣,如果沒有適當的工具,轉換可能會造成混淆。關於你的類型檢查:Scala有一個非常強大的靜態類型系統;通常你不需要檢查動態類型。在這種情況下,'contentPane.children'的類型爲'ObservableList [javafx.scene.Node]'... –
...所以不需要檢查動態類型。如果您確實需要了解運行時類型,通常我認爲最簡潔的方法是使用部分函數,例如'match'-clause。最後,從'A'到'B'和從'B'到'A'的隱式轉換沒有任何特別的危險:最多應用一個隱式轉換,隱式轉換隻發生在編譯時。 –