Mi Application
clase se ve así:
public class Test extends Application {
private static Logger logger = LogManager.getRootLogger();
@Override
public void start(Stage primaryStage) throws Exception {
String resourcePath = "/resources/fxml/MainView.fxml";
URL location = getClass().getResource(resourcePath);
FXMLLoader fxmlLoader = new FXMLLoader(location);
Scene scene = new Scene(fxmlLoader.load(), 500, 500);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
El FXMLLoader
crea una instancia del controlador correspondiente (dado en el FXML
archivo a través de fx:controller
) invocando primero el constructor predeterminado y luego el initialize
método:
public class MainViewController {
public MainViewController() {
System.out.println("first");
}
@FXML
public void initialize() {
System.out.println("second");
}
}
La salida es:
first
second
Entonces, ¿por qué existe el initialize
método? ¿Cuál es la diferencia entre usar un constructor o el initialize
método para inicializar las cosas requeridas por el controlador?
¡Gracias por tus sugerencias!
FXMLLoader
, ¿verdad? Así que no veo ningún beneficio en esperar elinitialize()
método -. Tan pronto como se carga el FXML, el siguiente código tiene acceso a las@FXML
variables. Claro, lo hace en el método de inicio y no en el constructor, pero ¿initialize()
aportaría algún beneficio en su caso?El
initialize
método se llama después de que@FXML
se hayan inyectado todos los miembros anotados. Suponga que tiene una vista de tabla que desea completar con datos:class MyController { @FXML TableView<MyModel> tableView; public MyController() { tableView.getItems().addAll(getDataFromSource()); // results in NullPointerException, as tableView is null at this point. } @FXML public void initialize() { tableView.getItems().addAll(getDataFromSource()); // Perfectly Ok here, as FXMLLoader already populated all @FXML annotated members. } }
fuente
Además de las respuestas anteriores, probablemente debería tenerse en cuenta que existe una forma heredada de implementar la inicialización. Hay una interfaz llamada Initializable de la biblioteca fxml.
import javafx.fxml.Initializable; class MyController implements Initializable { @FXML private TableView<MyModel> tableView; @Override public void initialize(URL location, ResourceBundle resources) { tableView.getItems().addAll(getDataFromSource()); } }
Parámetros:
location - The location used to resolve relative paths for the root object, or null if the location is not known. resources - The resources used to localize the root object, or null if the root object was not localized.
Y la nota de los documentos por qué funciona la forma simple de usar
@FXML public void initialize()
:NOTE
Esta interfaz ha sido reemplazada por la inyección automática de propiedades de ubicación y recursos en el controlador. FXMLLoader ahora llamará automáticamente a cualquier método initialize () no-arg adecuadamente anotado definido por el controlador. Se recomienda que se utilice el método de inyección siempre que sea posible.fuente