2014-11-16 4 views
4

Я пытаюсь выяснить, как работать с JavaFx. Я построил интерфейс приложения в Scene Builder. Но я не могу получить доступ к компоненту, так как все загружаются в родительский.FXMLLoader как получить доступ к компонентам с помощью FXID?

Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml")); 

Если я изменю «Родитель» на «панели» я могу получить доступ к GetChildren(), но не ясно, как получить контроль, если я знаю, Fx: ID ...

вопрос еще проще. Я добавил Label или TextField в Scene Builder. Как изменить его текст из кода, если я знаю fx: id?

Я в отчаянии.

ответ

4

Вы должны создать класс контроллера для вашего FXML документа, в котором вы можете выполнять любые функции, необходимые для выполнения с участием компонентов пользовательского интерфейса. Вы можете аннотировать поля в этом классе @FXML, и они будут заполнены FXMLLoader, сопоставляя атрибут fx:id с именем поля.

Пройдите через tutorial для получения более подробной информации и посмотрите на Introduction to FXML documentation.

Простой пример:

Sample.fxml:

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

<?import javafx.scene.layout.VBox?> 
<?import javafx.scene.control.Label?> 
<?import javafx.scene.control.Button?> 

<VBox xmlns:fx="http://javafx.com/fxml/1" fx:controller="SampleController"> 
    <Label fx:id="countLabel"/> 
    <Button fx:id="incrementButton" text="Increment" onAction="#increment"/> 
</VBox> 

SampleController.java:

import javafx.fxml.FXML; 
import javafx.scene.control.Label; 


public class SampleController { 

    private int count = 0 ; 

    @FXML 
    private Label countLabel ; 

    @FXML 
    private void increment() { 
     count++; 
     countLabel.setText("Count: "+count); 
    } 
} 

SampleMain.java:

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 

public class SampleMain extends Application { 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     Scene scene = new Scene(FXMLLoader.load(getClass().getResource("Sample.fxml")), 250, 75); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

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

Спасибо! Это отличное решение. Проблема решена! – JavaPanic

3

FXMLLoader.getNamespace() можно использовать, это карта названных компонентов.

FXMLLoader loader = new FXMLLoader(getClass().getResource("FXMLDocument.fxml")); 
Parent root = loader.load(); 
TextField foo = (TextField)loader.getNamespace().get("exampleFxId"); 
+0

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

+0

Я согласен Я использую только контроллеры, просто полезный крючок в API – Adam

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