【问题标题】:JavaFX Dynamically add Nodes to pane with fx:id or idJavaFX 使用 fx:id 或 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 来管理节点,但非常麻烦。正如我所说,我懒得一次只制作一个节点,感谢您的帮助

标签: javafx fxml


【解决方案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+"]");
        });
    }
}

【讨论】:

  • 感谢您的代码。我会尽量写不那么冗长的代码
猜你喜欢
  • 1970-01-01
  • 2018-06-30
  • 2021-12-23
  • 2015-02-26
  • 1970-01-01
  • 2014-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多