我正在处理可以在图像上绘制矩形的东西。它工作得很好,因为JavaFX是轻而易举的,但我有一个小问题,我似乎不明白。
我一直使用for(对象b:ArrayList),从来没有发生过这种情况。以下是代码的重要部分:
private void drawRooms() {
System.out.println("=========================================");
gc.clearRect(0, 0, canvas.getWidth(), canvas.getHeight());
gc.drawImage(image, 0, 0);
boolean bFirst = true;
double lastX = 0.0, firstX = 0.0, lastY = 0.0, firstY = 0.0;
gc.setStroke(RED);
gc.setLineWidth(10);
System.out.println("alRooms " + alRooms.toString());
for (Room r : alRooms) {
System.out.println("r " + r.getCords());
for (Coordinate c : r.alCords) {
System.out.println("C " + c.getX());
if (bFirst) {
bFirst = false;
lastX = firstX = c.getX();
lastY = firstY = c.getY();
} else {
gc.strokeLine(lastX, lastY, c.getX(), c.getY());
lastX = c.getX();
lastY = c.getY();
}
}
gc.strokeLine(firstX, firstY, lastX, lastY);
bFirst = true;
}
}
这是在创建所述房间后立即调用drawRoom()的地方:
alRooms.add(new Room(txRoomName.getText(), alCords));
System.out.println("alRooms size " + alRooms.size());
System.out.println("alRoom to string " + alRooms.toString());
alCords.clear();
drawRooms();
忽略System.out.println,我一直在使用它进行调试。无论如何,这是控制台输出:
Created new CoorRoom asd
[tcp_test_beacon.Coordinate@71afa660, tcp_test_beacon.Coordinate@8227d0c, tcp_test_beacon.Coordinate@1c50a611, tcp_test_beacon.Coordinate@2a467bed]
alRooms size 1
alRoom to string [tcp_test_beacon.Room@26565463]
=========================================
alRooms [tcp_test_beacon.Room@26565463]
r []
如您所见,我创建了一个房间并将其添加到alRooms,这是一个ArrayList。它的toString(),在添加房间之后,在for()循环之前返回与toString()相同的内容。我也得到了房间的alCords.toString,这意味着它有某种价值。 然后,它进入r循环,但getCords()不返回任何内容。这已经很奇怪,因为Object Room的getCords()看起来像这样:
public ArrayList<Coordinate> getCords(){
return alCords;
}
之后,甚至认为r.alCords,它是一个ArrayList,应该存在,它没有,并且从不执行Coordinate的for循环,如缺少的System.out所示。我在这看什么?我想我可能错过了一些非常明显的东西......
答案 0 :(得分:1)
检查您是否设置了有效的alCords
且不是空的。在行
alRooms.add(new Room(txRoomName.getText(), alCords)); // Debug here
答案 1 :(得分:1)
从您的摘要中,您可以看到,您使用Room
创建了新的Coorinates
:
alRooms.add(new Room(txRoomName.getText(), alCords));
System.out.println("alRooms size " + alRooms.size());
System.out.println("alRoom to string " + alRooms.toString());
alCords.clear();
在创建新Room
期间,您不仅仅是新List
,而是引用该对象!在方法执行之前,您将在稍后清除!
alRooms.add(新房间(txRoomName.getText(), alCords )); 的 alCords 强> .clear();
稍后我们可以看到,您的foeach
标记已正确执行,因为您可以看到此行r []
。但由于上述原因,List
Coordinates
为空。只需将代码更改为以下内容:
alRooms.add(new Room(txRoomName.getText(), new ArrayList(alCords)));
System.out.println("alRooms size " + alRooms.size());
System.out.println("alRoom to string " + alRooms.toString());
alCords.clear();