usar example como javafx fxml fxmlloader

example - javafx fx controller



¿Se necesita @FXML para cada declaración? (3)

¿Se necesita @FXML para cada declaración o solo para la primera?

En otras palabras, ¿debería usar

@FXML public Label timerLabel = new Label(); @FXML public TextField mainTextField, projectTextField ; @FXML public Button goButton, deleteAllButton ; @FXML public ComboBox<String> projectComboBox ; @FXML public TableView<Entry> mainTable ; @FXML public TableColumn<Entry, String> titleColumn, timeColumn, dateColumn ; @FXML public TableColumn<Entry, Boolean> checkColumn, buttonColumn ; @FXML public checkBox checkAllCheckBox ;

O

@FXML public Label timerLabel = new Label(); public TextField mainTextField, projectTextField ; public Button goButton, deleteAllButton ; public ComboBox<String> projectComboBox ; public TableView<Entry> mainTable ; public TableColumn<Entry, String> titleColumn, timeColumn, dateColumn ; public TableColumn<Entry, Boolean> checkColumn, buttonColumn ; public checkBox checkAllCheckBox ;

¡Gracias!


La anotación @FXML permite que un FXMLLoader inyecte valores definidos en un archivo FXML en referencias en la clase de controlador. En otras palabras, si anota su timerLabel con @FXML , @FXML lo inicializará cuando un elemento del archivo FXML invoque el método load() con fx:id="timerLabel" . Como otros han señalado en los comentarios, esto significa que nunca debe escribir código como

@FXML private Label timerLabel = new Label();

Aquí timerLabel se inicializará primero en la new Label(); crea en el código y luego se reiniciará casi de inmediato al valor definido en el archivo FXML. Esto es, en el mejor de los casos, redundante y, en el peor, engañoso. Si no hace coincidir correctamente los nombres de las variables con el fx:id , su variable se referirá a la Label incorrecta y el error será muy difícil de rastrear.

Para llegar a su pregunta real:

Cuando FXMLLoader carga el archivo FXML, intentará inyectar cualquier elemento que tenga un atributo fx:id en el controlador. Buscará

  1. Cualquier campo public con un nombre de variable que coincida con el atributo fx:id , o
  2. Cualquier campo ( public o no) con un nombre de variable que coincida con el atributo fx:id anotado con @FXML .

Entonces, en su ejemplo, dado que todos sus campos son public , puede omitir todas las anotaciones @FXML (incluso la primera) y aún funcionará.

Sin embargo, si sigue las buenas prácticas y hace que sus campos sean private , cada declaración debe anotarse en @FXML para que la inyección funcione.

Entonces

@FXML private Label timerLabel; @FXML private TextField mainTextField;

etc funcionará, pero

@FXML private Label timerLabel; private TextField mainTextField;

No lo haré.


para cada

fx:id="somename"

tu necesitas un

@FXML public SomeClass somename;

Prefiero escribirlo en una línea, porque es más fácil de leer cuando hay muchos

@FXML public SomeClass somename;

sin inicializar

@FXML public Label timerLabel = new Label(); // this is wrong


@FXML private TextField idTextField; @FXML private TextField passwordTextField;

O

@FXML private TextField idTextField, passwordTextField;