/ / Inclusion de balises dans FXML - javafx-2, fxml

Inclusion de balises dans FXML - javafx-2, fxml

J'aimerais savoir s'il y a moyen d'incluremorceaux de code (tags) définis dans le même fichier FXML. Ce que je veux, c'est inclure la même image plusieurs fois sans avoir à copier-coller toutes les propriétés:

<HBox>
<Label translateY="25" alignment="center"  text="">
<graphic>
<ImageView fitWidth="100" preserveRatio="true" smooth="true">
<image>
<Image url="arrow_right.png"/>
</image>
</ImageView>
</graphic>
</Label>
</HBox>

Je voudrais quelque chose comme:

<fx:define>
<Label fx:id="myLabel" translateY="25" alignment="center"  text="">
<graphic>
<ImageView fitWidth="100" preserveRatio="true" smooth="true">
<image>
<Image url="arrow_right.png"/>
</image>
</ImageView>
</graphic>
</Label>
</fx:define>

<HBox>
<fx:include source="$myLabel" />
</HBox>

J'ai lu cette réponse https://stackoverflow.com/a/8490764/1606953, mais couvre l’inclusion de sources externes (= autres fichiers). Je suis plus intéressé par l'inclusion de petits morceaux de code

Merci à tous

Réponses:

1 pour la réponse № 1

<fx:include> est certainement le meilleur moyen de gérer cela. Vous ne pouvez pas utiliser <fx: define> ici car "myLabel" ne peut jamais avoir qu'un seul nœud parent. En plaçant le Label dans une inclusion, vous pourrez créer plusieurs instances du contenu, chacune pouvant avoir son propre parent.


0 pour la réponse № 2

J'ai (presque) trouvé ce que je cherchais:

my-tab.fxml:

<HBox>
<fx:define>
<Label fx:id="arrow" alignment="center"  text="" maxWidth="Infinity" VBox.vgrow="ALWAYS" HBox.hgrow="ALWAYS">
<graphic>
<ImageView fitWidth="100" preserveRatio="true" smooth="true">
<image>
<Image url="peet/resources/images/arrow_right.png"/>
</image>
</ImageView>
</graphic>
</Label>
</fx:define>
<children>
<Button wrapText="true" text="AAA" maxHeight="Infinity" maxWidth="Infinity"  VBox.vgrow="ALWAYS" HBox.hgrow="ALWAYS" />
<fx:reference source="arrow" />
<Button text="BBB" wrapText="true" minHeight="150" minWidth="100" maxWidth="Infinity" VBox.vgrow="ALWAYS" HBox.hgrow="ALWAYS" />
<fx:reference source="arrow" />
<Button text="CCC" wrapText="true" minHeight="150" minWidth="100" maxWidth="Infinity" VBox.vgrow="ALWAYS" HBox.hgrow="ALWAYS" />
<fx:reference source="arrow" />
<Button  text="DDD" wrapText="true" minHeight="150" minWidth="100" maxWidth="Infinity" VBox.vgrow="ALWAYS" HBox.hgrow="ALWAYS" />
</children>
</HBox>

Cela ne fonctionne que si nous ne faisons qu'une référence. Si nous faisons 3 références, comme ici, nous obtenons cette exception:

Children: duplicate children added: parent = HBox@2df02fde
file:/C:/.../my-tab.fxml:48
file:/C:/.../Xxx.jar!/xxx/client/MainTabs.fxml:16
at javafx.scene.Parent$1.onProposedChange(Parent.java:307)
at com.sun.javafx.collections.VetoableObservableList.add(VetoableObservableList.java:165)
at com.sun.javafx.collections.ObservableListWrapper.add(ObservableListWrapper.java:144)
at javafx.fxml.FXMLLoader$Element.add(FXMLLoader.java:130)
at javafx.fxml.FXMLLoader$PropertyElement.add(FXMLLoader.java:1179)
at javafx.fxml.FXMLLoader$ValueElement.processEndElement(FXMLLoader.java:609)
at javafx.fxml.FXMLLoader.processEndElement(FXMLLoader.java:2430)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2136)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2028)
at javafx.fxml.FXMLLoader$IncludeElement.constructValue(FXMLLoader.java:937)
at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:567)
at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2314)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2131)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2028)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2742)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2721)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2707)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2694)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2683)
at xxx.client.XXX.start(XXX.java:21)
at com.sun.javafx.application.LauncherImpl$5.run(LauncherImpl.java:319)
at com.sun.javafx.application.PlatformImpl$5.run(PlatformImpl.java:206)
at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:173)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29)
at com.sun.glass.ui.win.WinApplication$2$1.run(WinApplication.java:67)
at java.lang.Thread.run(Thread.java:722)

Des options?