FXMLLoader how to access the components by FXID?

前端 未结 2 1677
盖世英雄少女心
盖世英雄少女心 2020-12-05 16:08

I\'m trying to figure out how to work with JavaFx. I built the application interface in Scene Builder. But I can not get access to the component, since all loaded into the P

相关标签:
2条回答
  • 2020-12-05 17:02

    You should create a controller class for your FXML document, in which you can perform any functionality you need to perform involving the UI components. You can annotate fields in that class with @FXML and they will be populated by the FXMLLoader, matching the fx:id attribute to the field name.

    Work through the tutorial for more details, and have a look at the Introduction to FXML documentation.

    Simple example:

    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 讨论(0)
  • 2020-12-05 17:03

    FXMLLoader.getNamespace() can be used, this is a map of named components.

    FXMLLoader loader = new FXMLLoader(getClass().getResource("FXMLDocument.fxml"));
    Parent root = loader.load();
    TextField foo = (TextField)loader.getNamespace().get("exampleFxId");
    
    0 讨论(0)
提交回复
热议问题