带有 fxml 的 ScalaFX i18n 不工作
ScalaFX i18n with fxml not working
首先是工作代码:
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 中没问题,但会抛出编译器错误:
Caused by: java.lang.ClassCastException:
javafx.scene.layout.BorderPane cannot be cast to
scalafx.scene.layout.BorderPane
我该如何解决这个问题?
"Now the constructor scene = new Scene(root)
cannot be resolved.":那是因为 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
}
}
首先是工作代码:
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 中没问题,但会抛出编译器错误:
Caused by: java.lang.ClassCastException: javafx.scene.layout.BorderPane cannot be cast to scalafx.scene.layout.BorderPane
我该如何解决这个问题?
"Now the constructor scene = new Scene(root)
cannot be resolved.":那是因为 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
}
}