如何在JavaFX8中多次使用控件?
我目前正在开始使用JavaFX8,并在一个简单的解决方案中提出了以下问题: 我有不同的控件(如何在JavaFX8中多次使用控件?,java,javafx-8,Java,Javafx 8,我目前正在开始使用JavaFX8,并在一个简单的解决方案中提出了以下问题: 我有不同的控件(按钮),它们将出现 在窗格的主要内容(中心) 在页脚中(窗格的底部) 现在,最后一个.addAll()似乎删除了另一个框中的引用 BorderPane root = new BorderPane(); root.setCenter(vbox); root.setBottom(hbox); 输出: 我尝试(为了测试)简单地重用按钮,但是: root.setCenter(one); root.setBo
按钮
),它们将出现
窗格的主要内容(中心)
窗格的底部)
.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
- 为什么控件不能重用
场景的根节点
,的子可观察列表
父节点
,或作为节点的剪辑
如果程序将子节点添加到父节点
(包括组
,区域
,
等),并且该节点已经是另一个父节点的子节点或
作为场景的根节点,该节点将自动(并以静默方式)从
它以前的父母
因此,你不能做你想做的事。一个按钮只能显示一次,不能在两个位置使用相同的按钮。为了更清楚地说明这一点,如果您能够在两个位置拥有相同的实例,例如getParent()
方法应该返回什么?没什么,这是不可能的。一个实例只能存在于一个位置
如果要重复使用按钮,必须复制该按钮。您收到的错误
Caused by: java.lang.IllegalArgumentException: Children: duplicate children added: parent = BorderPane@1784a6
场景显示vbox中的“一”按钮和hbox中的“二”按钮和“三”按钮是相关的。您仅声明了3个按钮,而场景只能显示3个按钮。根据我的评论,您需要声明按钮4和按钮5,并将它们添加到hbox,您可能会看到所有5个按钮
我不知道它为什么会这样做,但它与控件的初始化有关。结果也可能是,它在vbox中添加了3个按钮,而在hbox中没有添加任何按钮。但是,由于hbox是在vbox之后初始化的,这就是为什么它将按钮2和3放入vbox,并在hbox中丢弃它们。(或者实际上抛出一个异常)我不知道为什么要重用这些按钮控件。对于每个按钮,单击时可能会附加一些特定的事件/代码。在您的情况下,将按钮2和3一次添加到vbox和hbox。因此出现了错误消息。我只需要声明按钮4和5,并将它们添加到hbox中。如果您使用的是scenebuilder之类的工具,您也不能在那里重用控件。@WonderWorld您误解了我的问题:相同控件重用的想法是,我希望使用相同功能的相同控件等。解释我为什么这样做真的需要很长时间+对于hbox和vbox方法,我没有收到任何错误消息。节点刚刚好节点没有消失,最后2个添加到hbox而不是vbox,因为您使用的是重复的控件。@WonderWorld消失了
,意思是不显示它们正在显示,但您没有足够的按钮来显示全部6个。:)谢谢你的努力,但斯莱内克回答得更早,更“干净”
Caused by: java.lang.IllegalArgumentException: Children: duplicate children added: parent = BorderPane@1784a6