[英]for(Room r : ArrayList<Room>) returns empty Room
我正在研究可以在圖像上繪制矩形的東西。 由於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 []
如您所見,我創建了一個房間並將其添加到ArrayList的alRooms中。 在添加房間之后,它的toString()返回與for()循環之前的toString()相同。 我還獲得了顯示房間的alCords.toString,這意味着它具有某種值。 之后,它進入r循環,但是getCords()不返回任何內容。 這已經很奇怪了,因為對象室的getCords()看起來像這樣:
public ArrayList<Coordinate> getCords(){
return alCords;
}
之后,甚至想到r.alCords(它是一個ArrayList)應該存在,它不存在,並且從不執行Coordinate的for循環,就像丟失的System.out所看到的那樣。我在這里看什么? 我想我可能遺漏了一些非常明顯的東西...
檢查您是否設置了有效的alCords
並且該值不為空。 在線調試
alRooms.add(new Room(txRoomName.getText(), alCords)); // Debug here
從您的代碼片段中,您可以看到您創建了帶有Coorinates
新Room
:
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
位置正確執行了,因為您可以看到此行r []
。 但是由於上述原因,“ Coordinates
List
”為空。 只需將您的代碼更改為如下所示:
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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.