2017-06-17 8 views
0

画像に四角形を描くことができるものに取り組んでいます。 JavaFXはとても簡単ですが、わかりやすい小さな問題があります。for(Room r:ArrayList <Room>)は空を返します。

私は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 
[[email protected], [email protected], [email protected], [email protected]] 
alRooms size 1 
alRoom to string [[email protected]] 
========================================= 
alRooms [tcp_test_beacon.R[email protected]] 
r [] 

あなたが見ることができるように、私は部屋を作成し、ArrayListのあるalRoomsに追加します。部屋を追加した直後のtoString()は、for()ループの直前のtoString()と同じものを返します。部屋のalCords.toStringも表示されます。つまり、何らかの値があります。 その後、rループに入りますが、getCords()は何も返しません。このオブジェクトの部屋の)(getCordsとして、すでに奇妙である、次のようになります、

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

でもArrayListにある、r.alCordsを考えて、それは座標のforループdoesntのと、存在している必要がありますが実行されることはありません私はここで何を見ているのですか?私はおそらく非常に明白な何かを見逃していると思います...

答えて

1

でデバッグスニペット、あなたが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(); 

作成中にあなただけのList新しい、しかし、そのオブジェクトへの参照ではないがパージングRoom新しいです!メソッドの実行の前に、後でクリアしますか?

alRooms.add(新しい部屋(txRoomName.getText()、alCords)); alCords .clear();

そして、私たちは、この行r []を見ることができるので、あなたのfoeachのステーションが正しく実行されていることがわかります。しかし、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

あなたは素晴らしいです。それはまさに問題でした!私はReferenceのことを知っていましたが、それが何を意味するのか全く理解できませんでした。これは素晴らしい!ここに実装できる方法はありますか? プライベートvoid setCords(ArrayList alCords){ this.alCords = alCords; } – Redimo

+0

@Redimo 'setCords(ArrayList alCords){this.alCords = new ArrayList(alCords);}のように設定できます。 } '喜んで助けてください。乾杯。 – GensaGames

+0

私は同じ問題に再び遭遇したと思います。私は以下のスニペットを持っています: 'パブリックルーム(String sName、double xy []){ this.sName = sName; polydouble = xy; shapeRoom =新しいポリライン(ポリダブル); 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

関連する問題