我想知道是否有一种方法可以包含在同一FXML文件中定义的代码片段(标签)。我想要的是多次包含相同的图像,而无需复制粘贴所有属性:
<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>
我想要像:
<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>
我已经阅读了这个答案https://stackoverflow.com/a/8490764/1606953,但它涵盖了外部来源(=其他文件)的包含。我对包含一小段代码感兴趣
谢谢大家
答案 0 :(得分:1)
&LT; FX:包括&GT;绝对是处理这个的最好方法。你不能使用&lt; fx:define&gt;因为“myLabel”只能拥有一个父节点。通过将Label放在include中,您将能够创建内容的多个实例,每个实例都可以拥有自己的父实例。
答案 1 :(得分:0)
我(几乎)找到了我要找的东西:
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>
这只适用于我们只提供1个参考。如果我们做3个引用,比如这里,我们会得到这个例外:
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)
任何选项?