Java 是否可以设置窗格';控制器类内部的资源?

Java 是否可以设置窗格';控制器类内部的资源?,java,javafx,javafx-2,Java,Javafx,Javafx 2,目前,当我想将翻译包设置到特定窗格时,我必须在加载之前进行设置。让我们考虑一个简单的例子: Bundle_en.属性 key=Sample Text MainApplication.java public class Main extends Application { @Override public void start(Stage primaryStage) throws Exception{ FXMLLoader fxmlLoader = new FX

目前,当我想将翻译包设置到特定窗格时,我必须在加载之前进行设置。让我们考虑一个简单的例子:

Bundle_en.属性

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>

据我所知,在应用程序中有两种方法。从fxml文档:

FXML文件的内容可以在读取文件时进行本地化。对于 例如,如果使用en_US语言环境加载FXML文件,则 基于以下内容为标签生成字符串“First Name” 资源字符串:

如果区域设置更改为fr\u fr并且重新加载FXML文件,则 标签上写着“Prénom”

另一方面,您可以更改java代码中的值:

Java代码的情况并非如此,因为必须手动更新 通过获取 引用它并调用适当的setter(例如 setText())

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

所以我认为不可能在initialize方法中设置资源。稍后您可能会从控制器加载资源,并从java代码中使用它们。不确定它是否是大型应用程序的最佳解决方案

希望这会有所帮助。

我建议使用构造并为每个自定义控件定义fxml和属性文件

如果您想遵循一些简单的命名约定,可以使用我编写的实用程序类来加载fxml文件:

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

public class MyPane extends SomePane {  

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

    ...  
}  
你可以在我的网站上了解更多

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

public class MyPane extends SomePane {  

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

    ...  
}