1

首先是工作代码:

val root: BorderPane = new BorderPane(jfxf.FXMLLoader.load(getClass.getResource("/GUI/main.fxml")))

stage = new PrimaryStage()
{
  title = "FXML Test"
  scene = new Scene(root)
}

这里没问题。现在我想像这样添加 i18n 支持:

val bundle: ResourceBundle = new PropertyResourceBundle(getClass.getResource("/i18n/en.properties").openStream)
val loader: FXMLLoader = new FXMLLoader(getClass.getResource("/GUI/main.fxml"), bundle)
val root = loader.load[jfxs.Parent]

stage = new PrimaryStage()
{
  title = "FXML Test"
  scene = new Scene(root)
}

现在scene = new Scene(root)无法解析构造函数。

我试图通过

1) 初始化一个新的 BorderPane,如:

val root = new BorderPane(loader.load[jfxs.Parent])

但是 BorderPane 的构造函数无法解析所以我尝试了

2) 将其投射到 BorderPane,例如:

val root = new BorderPane(loader.load[jfxs.Parent].asInstanceOf[BorderPane])

这在 IDE 中没问题,但会引发编译器错误:

引起:java.lang.ClassCastException:javafx.scene.layout.BorderPane 无法转换为 scalafx.scene.layout.BorderPane

我该如何解决这个问题?

4

1 回答 1

0

“现在scene = new Scene(root)无法解析构造函数。”:那是因为scalafx.scene.Scene构造函数需要一个类型的参数scalafx.scene.Parent而不是javafx.scene.Parent.

只需添加import scalafx.Includes._到您的导入中即可使用 ScalaFX 的隐式转换。然后你可以这样做:

import java.util.PropertyResourceBundle
import javafx.fxml.FXMLLoader
import javafx.{scene => jfxs}

import scalafx.Includes._
import scalafx.application.JFXApp
import scalafx.application.JFXApp.PrimaryStage
import scalafx.scene.Scene

object MyApp extends JFXApp{
  val bundle = new PropertyResourceBundle(getClass.getResource("/i18n/en.properties").openStream)
  val fxml = getClass.getResource("/GUI/main.fxml")
  val root: jfxs.Parent = FXMLLoader.load(fxml, bundle)

  stage = new PrimaryStage() {
    title = "FXML Test"
    scene = new Scene(root) // root is implicitly converted to scalafx.scene.Parent
  }
}
于 2015-07-31T22:46:16.653 回答