for(Room r:ArrayList <room>)返回空房间

时间:2017-06-17 11:35:07

标签: java loops for-loop arraylist methods

我正在处理可以在图像上绘制矩形的东西。它工作得很好,因为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所示。我在这看什么?我想我可能错过了一些非常明显的东西......

2 个答案:

答案 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();