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

时间:2015-04-09 11:38:41

标签: java javafx-8

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

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

  1. 主要内容(Pane
  2. 中心
  3. 在页脚(Pane
  4. 底部

    concept

    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);
    

    输出:

    gui

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

    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
    

    这让我想到了以下问题:

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

3 个答案:

答案 0 :(得分:5)

正如Node类的JavaDocs中所述:

  

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

     

如果程序将子节点添加到Parent(包括GroupRegion,   并且该节点已经是不同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中,节点只能在场景图中使用一次。这是因为节点例如包含位置。如果您要使用它两次,则需要两个位置。