【问题标题】:What is "automatic injection of location and resources properties into the controller" in JavaFX?JavaFX中的“将位置和资源属性自动注入控制器”是什么?
【发布时间】:2013-12-05 03:01:09
【问题描述】:

Initializable接口的描述中说:

注意此接口已被自动注入 位置和资源属性到控制器中。 FXMLLoader 将 现在自动调用任何适当注释的无参数初始化() 控制器定义的方法。建议注射 尽可能使用方法。

问题是:如何“适当注释”方法?我只找到一个注释——@FXML。还有其他的吗?

【问题讨论】:

  • suzan @fxml 标签显示变量或控制器是在 fxml 中设计的...为了设计更好的 fxml 方式可能对你有帮助stackoverflow.com/questions/19523341/adding-a-tilepane-instantiated-in-java-files-to-fxml
  • 我很惊讶这个答案还没有被接受。 :)

标签: java dependency-injection annotations javafx


【解决方案1】:

答案是located here

在 JavaFX 2.1 及更早版本中,控制器类需要 实现Initializable接口,当内容被通知时 相关的 FXML 文档已完全加载。在 JavaFX 中 2.2,这不再是必要的。 FXMLLoader 类的一个实例只是在控制器上查找 initialize() 方法并调用 它,如果有的话。请注意,类似于其他 FXML 回调方法 例如事件处理程序,这个方法必须用@FXML注解 如果不公开,则注释。

建议开发者在新的 发展。 Initializable 接口尚未被弃用,但 可能在未来的版本中。

编辑

经过更多研究,我现在可以提供一个 SSCCE 来演示如何将资源包注入带有注释的控制器。请注意,此 SSCCE 包含对 this SO question 答案的轻微修改。

这里是 SSCCE:

com/stackexchange/stackoverflow/_20107463/MyController.java:

package com.stackexchange.stackoverflow._20107463;

import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.scene.control.Label;

public class MyController {

  @FXML 
  private Label label;

  @FXML private ResourceBundle resources;

  @FXML
  private void initialize() {
    label.setText(resources.getString("key1"));
  }

  // Or if you don't want to use @FXML you could do:
  //public void initialize() {
  //  label.setText(resources.getString("key1"));
  //}
}

com/stackexchange/stackoverflow/_20107463/MyView.fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.*?>

<BorderPane fx:controller="com.stackexchange.stackoverflow._20107463.MyController" xmlns:fx="http://javafx.com/fxml">
  <top>
    <!-- This label's text will be set by the controller -->
    <Label fx:id="label"/>
  </top>
  <center>
    <!-- This label's text will be taken from the bundle automatically -->
    <Label text="%key2"/>
  </center>
</BorderPane>

com/stackexchange/stackoverflow/_20107463/BundleDemo.java:

package com.stackexchange.stackoverflow._20107463;

import java.io.IOException;
import java.util.Locale;
import java.util.ResourceBundle;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBoxBuilder;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class BundleDemo extends Application {

  private Stage stage;

  @Override
  public void start(Stage primaryStage) {
    stage = primaryStage;
    Button btnEN = new Button();
    btnEN.setText("English");
    btnEN.setOnAction(new EventHandler<ActionEvent>() {
      @Override public void handle(ActionEvent event) {
        loadView(new Locale("en", "EN"));
      }
    });

    Button btnKG = new Button();
    btnKG.setText("Español");
    btnKG.setOnAction(new EventHandler<ActionEvent>() {
      @Override public void handle(ActionEvent event) {
        loadView(new Locale("es", "ES"));
      }
    });

    VBox root = new VBox(20);
    root.getChildren().add(HBoxBuilder.create().spacing(10).style("-fx-background-color: gray").padding(new Insets(5)).children(btnEN, btnKG).build());
    root.getChildren().add(new StackPane());
    primaryStage.setScene(new Scene(root, 300, 250));
    primaryStage.show();
  }

  private void loadView(Locale locale) {
    try {
      FXMLLoader fxmlLoader = new FXMLLoader();

      fxmlLoader.setResources(ResourceBundle.getBundle("com.stackexchange.stackoverflow.bundles.MyBundle", locale));
      Pane pane = (BorderPane) fxmlLoader.load(this.getClass().getResource("MyView.fxml").openStream());
      // replace the content
      StackPane content = (StackPane) ((VBox) stage.getScene().getRoot()).getChildren().get(1);
      content.getChildren().clear();
      content.getChildren().add(pane);
    } catch (IOException ex) {
      ex.printStackTrace();
    }
  }

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

com/stackexchange/stackoverflow/_20107463/MyBundle_en.properties:

key1=Name Surname
key2=How are you?

com/stackexchange/stackoverflow/_20107463/MyBundle_es.properties:

key1=Apellido
key2=Que tal?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 2013-12-05
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多