如何在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

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

我有不同的控件(
按钮
),它们将出现

  • 窗格的主要内容(中心
  • 在页脚中(
    窗格的底部)
  • 现在,最后一个
    .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
      节点会发生什么情况
    • 为什么控件不能重用

    在JavaFX中,节点只能在场景图中使用一次。这很有意义,因为一个节点(例如)包含一个位置。如果要使用它两次,则需要两个位置。

    如类的JavaDocs中所述:

    在场景图中的任何位置,节点最多只能出现一次。 具体而言,节点在所有节点中出现的次数不得超过一次 以下内容:作为
    场景的根节点
    ,的子
    可观察列表
    父节点
    ,或作为
    节点的剪辑

    如果程序将子节点添加到
    父节点
    (包括
    区域
    , 等),并且该节点已经是另一个
    父节点的子节点或
    作为
    场景的根节点,该节点将自动(并以静默方式)从
    它以前的父母

    因此,你不能做你想做的事。一个按钮只能显示一次,不能在两个位置使用相同的按钮。为了更清楚地说明这一点,如果您能够在两个位置拥有相同的实例,例如
    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