2017-03-22 28 views
0

目前,当我想为特定的窗格设置翻译包时,我必须在加载之前执行此操作。让我们考虑一个简单的例子:是否可以在控制器类中设置Pane的recoures?

Bundle_en.properties

key=Sample Text 

MainApplication.java

public class Main extends Application { 

    @Override 
    public void start(Stage primaryStage) throws Exception{ 
     FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("sample.fxml")); 
     fxmlLoader.setResources(ResourceBundle.getBundle("bundles.Bundle",new Locale("en","EN"))); 
     Parent root = fxmlLoader.load(); 
     primaryStage.setTitle("Hello World"); 
     primaryStage.setScene(new Scene(root, 300, 275)); 
     primaryStage.show(); 
    } 


    public static void main(String[] args) { 
     launch(args); 
    } 
} 

现在我可以从包内使用的名称:

sample.fxml

<?import javafx.scene.layout.GridPane?> 
<?import javafx.scene.control.Label?> 

<GridPane fx:controller="sample.Controller" 
      xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10"> 
    <Label text="%key"/> 
</GridPane> 

问题:

是否可以将控制器内的资源设置为initialize()方法?

Controller.java

public class Controller { 
    @FXML 
    private void initialize() { 
    // setting resources here 
    } 
} 

回答

0

据我所知,你在国际化两种方式您的应用程序。从fxml文档:

随着文件被读取,FXML文件的内容可以被本地化。对于 例如,如果FXML文件使用en_US区域设置加载,那么它 产生字符串“名”为基于以下 资源字符串标签:

<Label text="%firstName"/>

如果locale 是将更改为fr_FR FXML文件重新加载,然后 标签显示“Prénom”。

在另一方面,你可以从Java代码更改值:

同样不是Java代码正确的,因为你必须手动更新 用户界面的每一个元素由内容获取一个 对它的引用并调用相应的setter(例如 setText())。

另外ResourceBundle是Initializable接口中initialize方法的输入参数,它在加载fxml文件时使用。

所以我不认为有可能在初始化方法中设置资源。您可能稍后可能会从Controller中加载资源并从Java代码中使用它们。不确定它是大型应用程序的最佳解决方案。

希望这会有所帮助。

0

我建议使用fx:root构造并为每个自定义控件定义fxml和properties文件。

如果你喜欢跟随一些简单的命名约定,你可以使用一个实用工具类,我写加载的文件FXML:

import org.drombler.commons.fx.fxml.FXMLLoaders; 
... 

public class MyPane extends SomePane { 

    public MyPane() { 
     FXMLLoaders.loadRoot(this); 
    } 

    ... 
} 

你可以在我的blog阅读更多关于这一点。

相关问题