可以在控制器类中设置Pane的recoures吗?

时间:2017-03-22 12:22:14

标签: java javafx javafx-2

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

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
  }
}

2 个答案:

答案 0 :(得分:0)

据我所知,你的应用程序有两种方式。来自fxml docs:

  

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

     

<Label text="%firstName"/>

     

如果区域设置更改到fr_FR ,则会重新加载FXML文件,   标签显示“Prénom。”

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

  

Java代码也是如此,因为您必须手动更新   通过获取a,用户界面的每个元素的内容   引用它并调用适当的setter(例如   的setText())。

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

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

希望这有帮助。

答案 1 :(得分:0)

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

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

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

public class MyPane extends SomePane {  

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

    ...  
}  

您可以在我的blog中了解更多相关信息。

相关问题