向已有Scene添加Polygon未显示:是不可见还是未添加成功?
先直接回答你的疑问:两种情况都有可能,但从你的代码来看,最可能的原因是Polygon本身的顶点设置错误导致它不可见,不过也存在列表索引使用不当导致添加的不是你刚创建的图形的可能。下面一步步拆解问题:
1. 先排查:Polygon是否被成功添加到Scene?
你可以在代码末尾加一行调试代码验证:
System.out.println("Triangle added to root? " + root.getChildren().contains(triangles.get(k)));
如果输出true,说明这个Polygon已经被成功添加到Scene的根节点里了,问题出在图形本身不可见;如果输出false或者抛出IndexOutOfBoundsException,那说明你添加的对象存在问题(比如索引k的取值不对)。
2. 代码里的核心问题:Polygon的顶点参数错误
JavaFX的Polygon构造函数接收的是成对的(x,y)顶点坐标,一个三角形需要3个顶点,也就是6个参数(格式类似new Polygon(x1,y1, x2,y2, x3,y3))。但你的代码里只传了3个参数:new Polygon(30, 10, 54),这相当于只定义了一个完整的点(30,10)和一个不完整的点(只有x坐标54,没有对应的y值),JavaFX会忽略这个不完整的顶点,最终得到的是一个几乎看不见的图形,而非三角形——这就是图形没显示的核心原因。
你需要把构造参数改成完整的三个顶点,比如:
// 示例:创建一个以(30,10)、(54,10)、(42,34)为顶点的三角形 triangles.add(new Polygon(30, 10, 54, 10, 42, 34));
3. 潜在的索引风险:使用k获取刚添加的元素可能出错
你刚把新Polygon添加到triangles列表后,直接用triangles.get(k)来操作它。如果k的值和列表的当前索引不匹配(比如之前k被修改过,或者列表里有其他未预期的元素),你操作的可能不是刚创建的那个Polygon,甚至会抛出索引越界异常。更安全的写法是直接引用刚创建的对象:
Polygon newTriangle = new Polygon(30, 10, 54, 10, 42, 34); triangles.add(newTriangle); // 直接用newTriangle操作,不用依赖k的索引 newTriangle.setFill(Color.RED); newTriangle.setLayoutX(5); newTriangle.setLayoutY(5); root.getChildren().add(newTriangle); k++;
4. 额外的调试技巧
如果修改顶点后还是看不见,可以尝试:
- 给Polygon设置明显的边框:
newTriangle.setStroke(Color.BLACK); newTriangle.setStrokeWidth(2);,这样即使填充有问题,边框也能显示出来; - 打印多边形的边界信息:
System.out.println("Triangle bounds: " + newTriangle.getBoundsInParent());,如果输出的宽高都是0,说明顶点设置还是有问题。
内容的提问来源于stack exchange,提问作者JavaMakesMeWantToCry

