create array of Label using FXML in JavaFX

主宰稳场 提交于 2019-11-29 12:15:20

Some things are just better done in Java than FXML. I would not create the labels in FXML at all in this scenario; just create the pane that is going to hold them, then create the labels in the controller and add them to the pane.

That said, it can be done the way you are asking, using <fx:reference>.

Do something like this:

<!-- create all the labels as usual -->
<Label fx:id="label1" text="Message 1"/>
<Label fx:id="label2" text="Message 2"/>
<!-- ... -->

<!-- use a define block to define an array list containing the labels: -->
<fx:define>
    <ArrayList fx:id="labelList">
        <fx:reference source="label1" />
        <fx:reference source="label2" /> 
        <!-- ... --> 
    </ArrayList>
</fx:define>

Then in the controller just inject the list:

@FXML
private List<Label> labelList ;

Complete example:

LabelListTest.fxml:

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

<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.Label?>
<?import java.util.ArrayList?>

<VBox xmlns:fx="http://javafx.com/fxml/1" fx:controller="LabelListController">
    <Label  fx:id="label1"/>
    <Label  fx:id="label2"/>
    <Label  fx:id="label3"/>
    <Label  fx:id="label4"/>
    <Label  fx:id="label5"/>
    <Label  fx:id="label6"/>
    <Label  fx:id="label7"/>
    <Label  fx:id="label8"/>
    <Label  fx:id="label9"/>
    <Label  fx:id="label10"/>

    <fx:define>
        <ArrayList fx:id="labelList" >
            <fx:reference source="label1"/>
            <fx:reference source="label2"/>
            <fx:reference source="label3"/>
            <fx:reference source="label4"/>
            <fx:reference source="label5"/>
            <fx:reference source="label6"/>
            <fx:reference source="label7"/>
            <fx:reference source="label8"/>
            <fx:reference source="label9"/>
            <fx:reference source="label10"/>
        </ArrayList>
    </fx:define>
</VBox>

LabelListController.java:

import java.util.List;

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


public class LabelListController {
    @FXML
    private List<Label> labelList ;

    public void initialize() {
        int count = 1 ;
        for (Label label : labelList) {
            label.setText("Message " + (count++) );
        }
    }
}

LabelListTest.java:

import java.io.IOException;

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

public class LabelListTest extends Application {

    @Override
    public void start(Stage primaryStage) throws IOException {
        Parent root = FXMLLoader.load(getClass().getResource("LabelListTest.fxml"));
        Scene scene = new Scene(root, 250, 450);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!