我目前正在开始使用javafx 8,并在一个简单的解决方案中提出了以下问题:
我有不同的控件(Button
),它们将出现
Pane
)Pane
)
Button one = new Button("1");
Button two = new Button("2");
Button three = new Button("3");
VBox vbox = new VBox();
vbox.getChildren().addAll(one, two, three);
HBox hbox = new HBox();
hbox.getChildren().addAll(two, three); //To clarify my problem i leave one node in vbox
现在似乎发生了最后一个.addAll()
,删除其他框中的引用。
BorderPane root = new BorderPane();
root.setCenter(vbox);
root.setBottom(hbox);
输出:
我尝试(测试)只是重复使用按钮,但是:
root.setCenter(one);
root.setBottom(one);
结果
java.lang.reflect.InvocationTargetException
...
Caused by: java.lang.RuntimeException: Exception in Application start method
...
Caused by: java.lang.IllegalArgumentException: Children: duplicate children added: parent = BorderPane@1784a61
这让我想到了以下问题:
HBox
和VBox
个节点发生什么?答案 0 :(得分:5)
正如Node
类的JavaDocs中所述:
在场景图中的任何位置最多可以出现一次节点。 具体来说,一个节点必须在所有节点中出现不超过一次 以下:作为
Scene
的根节点,子节点ObservableList
Parent
,或Node
的剪辑。如果程序将子节点添加到
Parent
(包括Group
,Region
, 并且该节点已经是不同Parent
或其他节点的子节点Scene
的根,自动(并静默)删除节点 它的前任父母。
因此,您无法做您想做的事情。一个按钮只能显示一次,您不能在两个地方使用相同的按钮。为了使这一点更加清晰 - 例如如果你能在两个地方拥有相同的实例,getParent()
方法会返回吗?没什么,这是不可能的。一个实例只能存在于一个地方。
如果要重复使用,则必须复制该按钮。
答案 1 :(得分:1)
您遇到的错误
Caused by: java.lang.IllegalArgumentException: Children: duplicate children added: parent = BorderPane@1784a6
并且该场景显示vbox中的"one" button
以及hbox中的"two"
和"three"
是相关的。您只声明了3个按钮,场景只能显示3个按钮。根据我的评论,你需要声明按钮4和5并将它们添加到hbox,你可能会看到所有5个按钮。
我不知道为什么会这样做,但它与控件的初始化有关。结果也可能是它为vbox添加了3个按钮而没有添加到hbox。但是因为hbox是在vbox之后初始化的,所以它将按钮2和3放在vbox中并将它们丢弃在hbox中。(或实际抛出异常)
答案 2 :(得分:0)
在JavaFX中,节点只能在场景图中使用一次。这是因为节点例如包含位置。如果您要使用它两次,则需要两个位置。