如何在javafx 8中多次使用控件?

Ben*_*Win 3 java javafx-8

我目前正在开始使用javafx 8,并在一个简单的解决方案中提出了以下问题:

我有不同的控件(Button),它们会出现

  1. 在主要内容(中心Pane)
  2. 在页脚(底部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
Run Code Online (Sandbox Code Playgroud)

现在似乎发生了最后一个.addAll(),删除了另一个框中的引用.

BorderPane root = new BorderPane();
root.setCenter(vbox);
root.setBottom(hbox);
Run Code Online (Sandbox Code Playgroud)

输出:

GUI

我尝试(测试)只是重复使用一个按钮,但是:

root.setCenter(one);
root.setBottom(one);
Run Code Online (Sandbox Code Playgroud)

结果是

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
Run Code Online (Sandbox Code Playgroud)

这让我想到了以下问题:

  • 有没有办法解决这个问题,除了创建新的按钮实例?
  • HBoxVBox节点会发生什么
  • 为什么控件不能重复使用?

Pet*_*ček 7

正如在Node类的JavaDocs中所说:

场景图中的任何位置最多可出现一次节点.具体而言,节点必须出现不超过一次在所有以下的:作为一个根节点Scene,孩子ObservableListParent,或作为一个剪辑Node.

如果程序将子节点添加到Parent(包括Group,Region等等)并且该节点已经是不同的子节点Parent或者根节点Scene,则该节点将自动(并静默地)从其父节点中删除.

因此,你无法做你想做的事情.一个按钮只能显示一次,两个地方不能有相同的按钮.为了使这更清楚 - getParent()如果你能够在两个地方拥有相同的实例,那么该方法应该返回什么?没什么,这是不可能的.一个实例只能存在于一个地方.

如果要重复使用,则必须复制该按钮.