JavaFX 使用 fx:id 或 id 将节点动态添加到窗格

Posted

技术标签:

【中文标题】JavaFX 使用 fx:id 或 id 将节点动态添加到窗格【英文标题】:JavaFX Dynamically add Nodes to pane with fx:id or id 【发布时间】:2015-12-11 19:53:21 【问题描述】:

我可以在带有 for next 循环的窗格上创建节点,但没有能力 为这些节点分配一个 fx:id 或一个 id 这可能是第一名吗?如果是这样,我需要在我的代码中添加什么? 或者我是否可以选择使用 for next 循环将信息写入 FXML 文件?

    private void MakeNode()
    for (int A = 1; A <= 42; A++)
    if(A==1)
        X=40;
        Y=40;
    else if(A>1 && A<=7)
        X = X + 120;
        Y = 40;
    else if(A==8)
        X = 40;
        Y = 160;
    else if(A>8&& A<=14)
        X = X + 120;
        Y = 160;
    else if(A==15)
        X = 40;
        Y = 280;
    else if(A>15&& A<=21)
        X = X + 120;
        Y = 280;
    else if(A==22)
        X = 40;
        Y = 400;
    else if(A>22&& A<=28)
        X = X + 120;
        Y = 400;
    else if(A==29)
        X = 40;
        Y = 520;
    else if(A>29&& A<=35)
        X = X + 120;
        Y = 520;
    else if(A==36)
        X = 40;
        Y = 640;
    else if(A>36&& A<=42)
        X = X + 120;
        Y = 640;
    
        cirA = new Circle(X,Y,16);
        //fxid = cir.concat(String.valueOf(A));
        //fxid = cir+String.valueOf(A);
        //cirA.setId(fxid);
        cirA.setFill(Color.YELLOW);
        cirA.setStroke(Color.BLACK);
        cirA.setStrokeWidth(4.0);
        pane.getChildren().add(cirA);

    

【问题讨论】:

fx:id 用于使 FXML 中定义的节点在控制器中的 Java 代码中可用。由于您的圈子已经在 J​​ava 中定义,因此您的问题没有任何意义。你到底想做什么? 顺便说一句,不要那么大的if-else 构造,而是:int column = (A-1) % 7;int row = (A-1)/7;X = 40 +120 *column;Y = 40 + 120 * row; @James_D 我正在尝试创建节点然后操作节点。例如,如果最终用户单击圆,则从一个圆到相邻圆绘制一条线 Horz。我变得懒惰并且厌倦了一次创建一个节点。如果没有 fx:id,很难将程序逻辑应用于节点。 像这样在循环中创建它们是正确的方法。但是,如果没有 FXML(或者如果没有在 FXML 中定义圆圈),则设置 fx:id 根本没有意义。是什么阻止您使用现有代码做您想做的事情? @James_D 我确实有这个项目的 fxml 文件。我发现节点有一个索引号。和 X 和 Y 值,但这使得节点的管理不太令人满意。我已经尝试过使用 css id 来管理节点,但非常麻烦。正如我所说,我懒得一次只制作一个节点,感谢您的帮助 【参考方案1】:

fx:id 只是一种将 FXML 中定义的元素引用到控制器的机制。如果您无论如何都在控制器中定义节点,则根本不需要(或者实际上,没有办法使用)fx:id

在创建 Circle 时,您已经引用了它。所以就在那里做任何你需要的事情。这是一个简单的示例(我清理了您的代码以使其不那么冗长):

private void makeNode() 
    for (int circleIndex = 0 ; circleIndex < 42 ; circleIndex++) 
        int column = circleIndex % 7 ;
        int row = circleIndex / 7 ;
        double x = 40 + 120 * column ;
        double y = 40 + 120 * row ;
        Circle circle = new Circle(x, y, 16);
        circle.setFill(Color.YELLOW);
        circle.setStroke(Color.BLACK);
        circle.setStrokeWidth(4.0);
        pane.getChildren().add(circle);

        circle.setOnMouseClicked(e -> 
            System.out.println("Clicked on ["+column+", "+row+"]");
        );
    

【讨论】:

感谢您的代码。我会尽量写不那么冗长的代码

以上是关于JavaFX 使用 fx:id 或 id 将节点动态添加到窗格的主要内容,如果未能解决你的问题,请参考以下文章

JavaFx 元素未绑定到 fx:id 上的控制器变量 [重复]

从另一个场景切换启用/禁用 MenuItem javafx?

javaFX树结构treeview使用

JAVAFX添加按钮事件备忘

在 JavaFX 中将 BlendMode 添加到裁剪节点

JavaFX 节点部分边框