2017-06-17 24 views
0

我正在处理可以在图像上绘制矩形的东西。它的工作非常好,因为JavaFX是一件轻而易举的事情,但我有一个我似乎不明白的小问题。(房间r:ArrayList <Room>)返回空房间

我一直使用for(object 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 
[[email protected], [email protected], [email protected], [email protected]2a467bed] 
alRooms size 1 
alRoom to string [[email protected]] 
========================================= 
alRooms [[email protected]] 
r [] 

正如你所看到的,我创建了一个房间,并把它添加到alRooms这是一个ArrayList。 toString()在添加房间之后立即返回与for()循环之前的toString()相同的值。我还会显示房间的alCords.toString,这意味着它具有某种价值。 然后,它进入r循环,但getCords()不返回任何内容。这已经是奇怪的,因为getCords(对象间的)看起来是这样的:

public ArrayList<Coordinate> getCords(){ 
    return alCords; 
} 

之后,甚至想到r.alCords,这是一个ArrayList,应该存在,它不并为永远不会执行循环坐标,由缺少System.out看到..我在这里看什么?我想我可能会错过一些非常明显的东西...

回答

1

从你的片段,您可以看到,您创建的新RoomCoorinates

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(new Room(txRoomName.getText(),alCords)); alCords .clear();

后来我们可以看到,你的foeach staement正确执行,因为你可以看到这一行r []。但ListCoordinates是空的,由于上述原因。只是改变你的代码是这样的:

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(); 
+0

你真棒。这正是问题!我知道参考资料,但从未完全理解这意味着什么。这很棒!有没有什么办法可以在这里实现它: private void setCords(ArrayList alCords){ this.alCords = alCords; } – Redimo

+0

@Redimo你可以设置,像'setCords(ArrayList alCords){this.alCords = new ArrayList(alCords); '很高兴帮助。干杯。 – GensaGames

+0

我想我可能会再次遇到同样的问题。我有以下代码片段: 'public room(String sName,double xy []){ this.sName = sName; polydouble = xy; shapeRoom = new Polyline(polydouble); shapeRoom.setFill(TRANSPARENT); shapeRoom.setStrokeWidth(3); shapeRoom.setStroke(RED); } public Polyline getPoly(){ return shapeRoom; }' 但是,当我做室r:alRooms - > r.getPoly(),我得到一个异常。甚至像插入'shapeRoom.getPoints())'一样简单;'给我一个例外。 – Redimo

1

检查您是否正在设置有效的alCords而且这不是空的。调试在行

alRooms.add(new Room(txRoomName.getText(), alCords)); // Debug here 
+0

感谢您的答案,@GensaGames发现它的错误! :) – Redimo