2016-12-02 35 views
0

我正在使用JavaFX8開發一個簡單的棋盤遊戲。如何獲取GridPane中Rectangle的屏幕/場景中心x,y?

對於遊戲板,我的決定是使用10x10 GridPane並在窗體的初始化方法中用矩形填充它的單元格。

private void drawBoard() { 
    gridpaneBoard.getChildren().clear(); 
    for (int y = 0; y < gridpaneBoard.getRowConstraints().size(); y++) 
     for (int x = 0; x < gridpaneBoard.getColumnConstraints().size(); x++) { 
      Rectangle rect = new Rectangle(55,55); 
      rect.setStroke(Color.BLACK); 

      Tile tile = GameController.getInstance().getBoard().getTile(x, y); 
      if (tile.hasBranch()) 
       rect.setFill(QuestionDifficulty.values()[tile.getBranch() 
                 .getQuestion().getQuestion() 
                 .getLevel()].getColor()); 
      else 
       rect.setFill(Color.WHITE); 

      gridpaneBoard.add(rect, x, y); 
      gridpaneBoard.add(new Label(String.valueOf(tile.getNumber())), x, y); 
     } 
} 

爲了擲骰後進行動畫播放的令牌移動,我想我需要知道每個分片的中心x &中心Y(以創建從源瓦到目的地瓦片的路徑轉換)。

我已經嘗試了各種答案給其他人的問題,但一切都爲我返回0,0。

這是這一幕的容器層次:

container hierarchy

這是輸出如何看待當下:

enter image description here

如果GridPane是罰款,我是什麼試圖實現,我怎麼能得到一個孩子的(在這種情況下是矩形的)屏幕/場景中心x,y?

如果GridPane不精,你能指出我的選擇,我如何能實現我想要的話..

謝謝!

+1

您需要知道centerX和centerY才能將標籤居中在您的rec內? –

+0

這可能是我的問題的另一個用途。但我主要關心的是爲路徑轉換找到矩形的中心。例如 ..將玩家代幣從瓦片#4移動到瓦片#12。 (動畫將在路徑中具有#5,#6,#7,#8,#9,#10,#11) – ckid

+0

已經通過簡單地在行/列約束上運行並設置V/H對齊來解決了標籤對齊問題到V/H pos.CENTER。 – ckid

回答

2

您只需撥打getBoundsInParent即可獲取其父母中的Node的尺寸。

下面的例子是有點簡單,但它仍應證明方法:

@Override 
public void start(Stage primaryStage) { 
    GridPane gridpaneBoard = new GridPane(); 
    for (int y = 0; y < 10; y++) { 
     for (int x = 0; x < 10; x++) { 
      Rectangle rect = new Rectangle(55, 55); 
      rect.setStroke(Color.BLACK); 

      rect.setFill((x + y) % 2 == 0 ? Color.WHITE : Color.DARKGRAY); 

      gridpaneBoard.add(rect, x, y); 
     } 
    } 

    gridpaneBoard.setOnMouseClicked(evt -> { 
     Node target = evt.getPickResult().getIntersectedNode(); 

     if (target != gridpaneBoard) { 
      // in your case you'd need to make sure this is not the Label 
      Bounds bounds = target.getBoundsInParent(); 
      System.out.println("bounds = " +bounds); 
      System.out.println("centerX = " +(bounds.getMinX() + bounds.getWidth()/2)); 
      System.out.println("centerY = " +(bounds.getMinY() + bounds.getHeight()/2)); 
     } 
    }); 

    Scene scene = new Scene(gridpaneBoard); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

如果座標不同,以需要的GridPane座標,你可以結合使用getBoundsInLocallocalTo...代替:

Bounds bounds = target.localToScene(target.getBoundsInLocal()); 

for scene bounds or

Bounds bounds = target.localToScreen(target.getBoundsInLocal()); 

屏幕邊界。

注意:這項工作獨立於任何屬性修改如何GridPane佈局它的孩子。

+0

已經嘗試過:http://paste.ofcode.org/kpkcc2gSbagTbL8zWevtQ6和所有矩形在中心x,y上返回27.5。 – ckid

+1

@ckid您可能會在第一次佈局之前調用該代碼。在這種情況下'GridPane'還沒有設置它的子節點的位置。如果稍後在ui的輸入事件中調用,則不應該存在這樣的問題。例如。這是我的代碼打印,如果你點擊右下角矩形:'bounds = BoundingBox [minX:504.0,minY:504.0,minZ:0.0,width:56.0,height:56.0,depth:0.0,maxX:560.0,maxY :560.0,maxZ:0.0] centerX = 532.0 centerY = 532.0' – fabian

+0

這是正確的,我做了syso的初始化,在drawBoard()之後.. 在Roll按鈕的動作事件上測試了相同的代碼,它給了我,什麼似乎是預期的結果!謝謝! – ckid

1

您可以使用:

- GridPane.getColumnIndex(Node)拿到列索引。

- GridPane.getRowIndex(Node)獲得行索引。

- 由於你知道你的孩子(矩形)的WidthHeight(55,55),你可以計算出它的centerXcenterY這是相對於其容器的位置,但由於您使用的是GridPane我不認爲這是可能的,因爲這個人有限制。您可以通過更改對象的容器來修復它,或者在另一個原始/列中完全重新繪製它,這裏是一個示例Replace a node at (row,col)

+0

有沒有辦法獲得GridPane的左上角x,y場景位置?我可能會基於此獲得每個tile的場景中心(並且知道它們的寬度/高度和列數/行數)。 – ckid

+1

爲什麼不使用TilePane? –

+0

現在嘗試了TilePane。據我所知,它不允許添加多個節點到一個位置。 使用TilePane可以讓屏幕/場景x,y的孩子變得更容易或更容易嗎? – ckid

相關問題