2013-12-21 5 views
0

Я новичок в изучении JavaFX и FXML. Большая часть моей логики приложения в классе FXMLController и базовый класс в значительной степени пустой, кроме основного кода, который был создан с помощью среды IDE NetBeans, например, как показано нижеДоступ к сцене из класса контроллера

@Override 
public void start(Stage stage) throws Exception { 
    Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml")); 

    Scene scene = new Scene(root); 

    stage.setScene(scene); 
    stage.show(); 
} 

У меня есть элемент с идентификатором input1, который имеет типа TextField , Как я могу получить доступ к этому (или любому другому другим) элементам управления по его идентификатору? (имея в виду, что я являюсь классом контроллера, а не основным классом).

Я нашел этот вопрос ниже, что именно то, что я ищу, но эта ситуация другая, потому что они находятся в основном классе, где определен scene. Как я могу получить доступ к scene из класса контроллера и использовать код в вопросе ниже.

How to find an element with an ID in JavaFX?

ответ

1

Это мой первый раз, отвечая на вопрос о переполнении стека поэтому, пожалуйста, идти просто на меня.

Я новичок в JavaFX, и у меня тоже была проблема с этим. Это что, если найдено. Ваш TextField в вашем FXMLDocument.fxml должны Fx: идентификатор, присвоенный ему, как:

<TextField fx:id="input1" layoutX="0.5" layoutX="0.5" /> 

Если вы используете JavaFX SceneBuilder, то вы можете найти Fx: идентификатор в разделе «Код: TextField» на правая сторона.

Тогда в вашем классе контроллера вы можете получить к нему доступ, но используя.

@FXML public TextField input1; 

Вы можете использовать ArrayList для перебора всех ваших TextFields. Вот пример.

@FXML public TextField input1; 
@FXML public TextField input2; 
@FXML public TextField input3; 
@FXML public TextField input4; 
@FXML public TextField input5; 
@FXML public TextField input6; 
@FXML public TextField input7; 
@FXML public Button button; 

List<TextField> inputs = new ArrayList<TextField>(); 

public void displayText(ActionEvent event) { 
    inputs.add(input1); 
    inputs.add(input2); 
    inputs.add(input3); 
    inputs.add(input4); 
    inputs.add(input5); 
    inputs.add(input6); 
    inputs.add(input7); 
    for (int x = 0; x < 7; x++) { 
     System.out.println(inputs.get(x).getText()); 
    } 
} 

Возможно, будет более простой способ, но этот способ работает для меня.

+0

Вы можете вызвать lookup (...) или lookupAll (...) на любом графике сцены, который является предком узлов, которые вы ищете. Поэтому просто используйте инъекции (fx: id и @FXML аннотацию), чтобы получить ссылку на что-то, что содержит все ваши текстовые поля (например, корневой элемент), и вызвать поиск (...) на этом. Поиск немного хрупкий; они гарантируются только после того, как сцена была отображена (поэтому не будет работать в методе initialize (...). Возможно, вам лучше просто поместить текстовые поля в список или массив и выполнить итерацию через него. –

+0

ArrayList вероятно, ваш лучший выбор.Я обновлю свой ответ, чтобы показать пример. – Givver

+0

Спасибо за помощь. Я буду использовать List на данный момент, кажется достаточно хорошим для простого проекта, в котором я работаю. –

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