2015-05-13 1 views
9

Нужно ли @FXML для каждого объявления или только для первого?Нужно ли @FXML для каждой декларации?

Другими словами, я должен использовать

@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 ; 

Или

@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 ; 

Спасибо!

+3

Попробуйте оба из них;) – ItachiUchiha

+0

Я не вижу различий: | – Romeo

+0

Я не видел второго решения. Думаю, это невозможно. просто попробуйте –

ответ

29

Аннотации @FXML позволяют вводить значения, определенные в файле FXML, в значения, указанные в классе контроллера, FXMLLoader. Другими словами, если вы аннотируете свой timerLabel с помощью @FXML, он будет инициализирован FXMLLoader, когда метод load() вызывается элементом в файле FXML с fx:id="timerLabel". Как уже отмечалось в комментариях, это означает, что вы никогда не должны писать код как

@FXML 
private Label timerLabel = new Label(); 

Здесь timerLabel сначала будет инициализирован к new Label(); вы создаете в коде, а затем почти сразу же повторно инициализируется значение, определенное в файле FXML. Это в лучшем случае избыточно и в худшем случае вводит в заблуждение. Если вы неправильно сопоставляете имена переменных с fx:id, ваша переменная будет ссылаться на неправильный Label, и ошибку будет очень сложно отследить.

Чтобы добраться до фактического вопроса:

Когда FXMLLoader загружает файл FXML, он будет пытаться вводить какие-либо элементы, которые имеют атрибут fx:id в контроллер. Он будет искать

  1. Любого public поля с именем переменного соответствия атрибута fx:id, или
  2. Любого поля (public или нет) с переменным именем, совпадающим атрибутом fx:id, который аннотированный с @FXML.

Таким образом, в вашем примере, так как все ваши поля public, вы можете опустить все @FXML аннотаций (даже первый), и она будет работать.

Однако, если вы придерживаетесь надлежащей практики и делаете свои поля private, тогда каждая декларация должна быть аннотирована @FXML для инъекций на работу.

Так

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

и т.д. будет работать, но

@FXML 
private Label timerLabel; 
private TextField mainTextField; 

не будет.

+0

Требуется ли инъекция? Есть ли способ просто спросить загрузчика для элемента управления, который меня интересует (по fx: id)? – Joel

+0

Не уверен, что я понимаю этот вопрос. Разве это не то, что делает инъекция? –

4

для каждого

fx:id="somename" 

вам нужно

@FXML 
public SomeClass somename; 

Я предпочитаю писать его в одну линию, потому что это легче читать, когда есть много

@FXML public SomeClass somename; 

без инициализации

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

не будет 'timerLabel = new Label();' будет переопределено 'FXMLLoader'? – Andrew

Смежные вопросы