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: