2017-06-17 27 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