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

FXML tutorial (14) – tworzenie obiektów (7)

Znacznik <fx:copy>

Aby można było skopiować obiekt musi on posiadać konstruktor kopiujący. Takim obiektem jest Szturmowiec. Niestety węzły JavaFX nie posiadają konstruktora kopiującego więc nie można w ten sposób utworzyć kopii węzłów scenografu.

Klasa Szturmowiec.java

Klasa zawiera konstruktor kopiujący.

package codes;
public class Szturmowiec {
    private String typ;
    private Integer bron;

    //konstruktor zwykły
    public Szturmowiec(String typ, Integer bron) {
        this.typ = typ;
        this.bron = bron;
    }

    //konstruktor kopiujący
    public Szturmowiec(Szturmowiec szturmowiec) {
        this(szturmowiec.typ, szturmowiec.bron);
    }

    public Szturmowiec() {
        this(null, null);
    }

    public String getTyp() {
        return typ;
    }

    public void setTyp(String typ) {
        this.typ = typ;
    }

    public Integer getBron() {
        return bron;
    }

    public void setBron(Integer bron) {
        this.bron = bron;
    }

    @Override
    public String toString() {
        return "typ=" + typ + ", bron=" + bron;
    }
}
Plik listing14_fxcopy.fxml

Tworzymy 4 kopie obiektu.

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

<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.ListView?>
<?import javafx.collections.FXCollections?>
<?import codes.Szturmowiec?>

<VBox xmlns:fx="http://javafx.com/fxml">
	<Label fx:id="lab1" text="Lista szturmowców." />
	<fx:define>
		<Szturmowiec typ="S-631" bron="1252" fx:id="pattern" />
	</fx:define>
	<ListView>
		<items>
			<FXCollections fx:factory="observableArrayList">
				<fx:copy source="pattern" />
				<fx:copy source="pattern" />
				<fx:copy source="pattern" />
				<fx:copy source="pattern" />
			</FXCollections>
		</items>
	</ListView>
</VBox>
Klasa Listing14_fxcopy.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 Listing14_fxcopy 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/listing14_fxcopy.fxml");
            VBox root = fxmlUrl != null ? FXMLLoader.load(fxmlUrl) : new VBox();
            Scene scene = new Scene(root, 150, 150);
            stage.setScene(scene);
            stage.show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Po uruchomieniu klasy zobaczymy:

Widok po uruchomieniu kodu
Widok po uruchomieniu kodu