JavaFX z Arią - powrót do strony głównej

FXML tutorial (13) – tworzenie obiektów (6)

Znaczniki <fx:define> i <fx:reference>

Znacznik <fx:define> jest używany do tworzenia obiektów istniejących poza hierarchią elementów, do których musimy się odwoływać.
Jeżeli mamy utworzony element i chcemy utworzyć do niego referencję stosujemy atrybut – znak $ oznacza referencję do obiektu – albo używamy znacznika <fx:reference>.
Poniżej dwa przykłady.

Przykład 1

Plik listing13_fxreference_fxdefine.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<VBox xmlns:fx="http://javafx.com/fxml">
	<fx:define>
		<Image url="/resources/kwiatek.jpg" fx:id="kwiatek" />
	</fx:define>
	<ImageView>
		<image>
			<fx:reference source="kwiatek" />
		</image>
	</ImageView>
</VBox>
Klasa Listing13_fxreference_fxdefine.java

Klasa uruchamiająca.

package codes;


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

import java.net.URL;
public class Listing13_fxreference_fxdefine extends Application {
    public static void main(String[] args) {
        Application.launch(args);
    }

    @Override
    public void start(Stage stage) {
        try {
            URL fxmlUrl = this.getClass().getClassLoader()
                    .getResource("resources/listing13_fxreference_fxdefine.fxml");
            VBox root = fxmlUrl != null ? FXMLLoader.load(fxmlUrl) : new VBox();
            Scene scene = new Scene(root, 300, 250);
            stage.setScene(scene);
            stage.show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Po uruchomieniu klasy zobaczymy:

Widok po uruchomieniu aplikacji
Widok po uruchomieniu aplikacji

Przykład 2

Plik listing13q_fxreference_fxdefine.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<VBox xmlns:fx="http://javafx.com/fxml">
	<fx:define>
		<Image url="/resources/kwiatek.jpg" fx:id="kwiatek" />
	</fx:define>
	<ImageView image="$kwiatek" />
</VBox>
Klasa Listing13a_fxreference_fxdefine.java
package codes;

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

import java.net.URL;
public class Listing13a_fxreference_fxdefine extends Application {
    public static void main(String[] args) {
        Application.launch(args);
    }

    @Override
    public void start(Stage stage) {
        try {
            URL fxmlUrl = this.getClass().getClassLoader()
                    .getResource("resources/listing13a_fxreference_fxdefine.fxml");
            VBox root = fxmlUrl != null ? FXMLLoader.load(fxmlUrl) : new VBox();
            Scene scene = new Scene(root, 300, 250);
            stage.setScene(scene);
            stage.show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Po uruchomieniu klasy zobaczymy:

Widok po uruchomieniu aplikacji
Widok po uruchomieniu aplikacji