2014-11-16 4 views
4

저는 JavaFx로 작업하는 방법을 알아 내려고하고 있습니다. Scene Builder에 애플리케이션 인터페이스를 구축했습니다. 하지만 모든 요소가 부모에로드되었으므로 구성 요소에 액세스 할 수 없습니다. 나는 "창"의 "부모"를 변경하는 경우FXMLLoader FXID로 구성 요소에 액세스하는 방법은 무엇입니까?

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

나는 getChildren()에 액세스 할 수 있습니다,하지만 내가 FX 알고있는 경우 제어하는 ​​방법을 분명하지 않다 ... ID를

질문은 더욱 간단합니다. Scene Builder에 Label 또는 TextField를 추가했습니다. fx : id를 알고있는 경우 코드에서 텍스트를 어떻게 변경합니까?

저는 절망에 있습니다.

답변

4

FXML 문서의 컨트롤러 클래스를 만들어 UI 구성 요소와 관련하여 수행해야하는 모든 기능을 수행 할 수 있습니다. 해당 클래스의 필드에 @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에서 작업 asis 첫 번째 시험판 이후로, 나는 결코 전에이 접근법을 보지 못했습니다. 컨트롤러 클래스를 사용하는 표준 접근법은 더 나은 전반적인 디자인을 장려하는 청결한 분리를 제공하므로 좋지만 일부 경우에 일부 용도가 있음을 알 수 있습니다. –

+0

나는 콘트롤러도 사용한다는 것에 동의한다. API의 유용한 훅 – Adam

관련 문제