【问题标题】:Is it possible to set Pane's recoures inside of the controller class?是否可以在控制器类中设置 Pane 的 recoures?
【发布时间】:2017-03-22 12:22:14
【问题描述】:

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

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

【问题讨论】:

    标签: java javafx javafx-2


    【解决方案1】:

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

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

    &lt;Label text="%firstName"/&gt;

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

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

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

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

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

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

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

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

      import org.drombler.commons.fx.fxml.FXMLLoaders;  
      ...  
      
      public class MyPane extends SomePane {  
      
          public MyPane() {  
              FXMLLoaders.loadRoot(this);  
          }  
      
          ...  
      }  
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-01
        • 2015-06-14
        • 1970-01-01
        • 2017-03-06
        • 1970-01-01
        • 1970-01-01
        • 2021-09-11
        • 1970-01-01
        相关资源
        最近更新 更多