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 代码中可用。由于您的圈子已经在 Java 中定义,因此您的问题没有任何意义。你到底想做什么?
顺便说一句,不要那么大的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 上的控制器变量 [重复]