2016-12-02 1 views
0

Ich arbeite an einer einfachen Brettspielimplementierung in JavaFX8.Wie bekomme ich Bildschirm/Szene Mitte x, y von Rectangle innerhalb eines GridPane?

Für das Spielbrett war meine Entscheidung, ein 10x10 GridPane zu verwenden und seine Zellen mit Rectangles in Forms Initialisierungsmethode zu füllen.

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); 
     } 
} 

Um Spieler Token Bewegung nach Würfelrollen zu animieren, dachte ich, ich brauche die Mitte x & Mittelpunkt Y jeder Platte kennen (ein Wegübergang von Quell Fliese Zielkachel zu schaffen).

Ich habe alle möglichen Antworten auf die Fragen anderer Leute ausprobiert, aber alles ergab für mich 0,0.

Dies ist die Container-Hierarchie in dieser Szene:

container hierarchy

Dies ist, wie der Ausgang im Moment aussieht:

enter image description here

Wenn GridPane ist in Ordnung für das, was ich bin versuchen zu erreichen, wie kann ich ein Kind (in diesem Fall ein Rechteck) Bildschirm/Szene Mitte x, y bekommen?

Wenn GridPane nicht in Ordnung ist, können Sie mir zeigen auf Alternativen und wie kann ich erreichen, was ich will, dann ..

Thank you!

+1

Sie müssen die CenterX und CenterY kennen, um das Label in Ihrer Rec. Zu zentrieren? –

+0

das könnte eine andere Verwendung für meine Frage sein. aber mein Hauptanliegen ist das Finden der Mitte des Rechtecks ​​für Pfadübergänge. zum Beispiel .. Spieler Spieler Token von Kachel # 4 nach Kachel # 12 bewegen. (Animation hat auch # 5, # 6, # 7, # 8, # 9, # 10, # 11 im Pfad) – ckid

+0

haben das Problem mit der Etikettenausrichtung gelöst, indem einfach auf Zeilen-/Spaltenbedingungen und V/H-Ausrichtung eingestellt wurde zu V/H pos.CENTER. – ckid

Antwort

2

Sie können einfach getBoundsInParent anrufen, um die Abmessungen des Node in seinem Elternteil zu erhalten.

Das folgende Beispiel ist etwas vereinfacht, aber es sollte den Ansatz zeigen, dennoch:

@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(); 
} 

Wenn verschiedene Koordinaten in die GridPane Koordinaten erforderlich sind, könnten Sie getBoundsInLocal in Kombination mit localTo... statt:

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

für die Szenengrenzen oder

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

für Bildschirmgrenzen.

Hinweis: Dies funktioniert unabhängig von allen Eigenschaften ändern wie GridPane Layouts es Kinder ist.

+0

haben dies versucht: http://paste.ofcode.org/kpkcc2gSbagTbL8zWevtQ6 und alle Rechtecke 27.5 auf Mitte x, y zurückgegeben. – ckid

+1

@ckid Sie rufen diesen Code wahrscheinlich vor dem ersten Layout-Durchlauf auf. In diesem Fall hat 'GridPane' noch nicht die Position seiner Kinder festgelegt. Wenn später ein Eingabeereignis für das ui aufgerufen wird, sollte dieses Problem nicht auftreten. Z.B. Dies ist, was mein Code druckt, wenn Sie auf den unteren rechten Rect klicken: 'Grenzen = BoundingBox [minX: 504.0, minY: 504.0, minZ: 0.0, Breite: 56.0, Höhe: 56.0, Tiefe: 0.0, maxX: 560.0, maxY : 560.0, maxZ: 0.0] centerX = 532.0 centerY = 532.0' – fabian

+0

das ist richtig, ich habe das syso in initialisieren, direkt nach drawBoard() .. getestet gleichen code auf das aktionsereignis für Roll button und es gibt mir, Was scheint zu erwarten Ergebnisse! Vielen Dank! – ckid

1

können Sie verwenden:

-GridPane.getColumnIndex(Node) den Spaltenindex zu erhalten.

- GridPane.getRowIndex(Node), um den Zeilenindex zu erhalten.

-Da Sie die Width und die Height (55,55) Ihres Kindes (Rectangle) kennen, können Sie nur seine berechnen centerX, centerY, die seine Position in dem Behälter relativ ist, aber da Sie verwenden, um eine GridPane Ich denke nicht, dass es möglich ist, da dieser Constraints hat. Sie können es beheben, indem Sie den Container Ihres Objekts ändern oder es in einer anderen Raw/Column vollständig neu zeichnen, hier ein Beispiel Replace a node at (row,col).

+0

Gibt es eine Möglichkeit, die X- und Y-Position der linken oberen Ecke des GridPanes zu erhalten? Ich werde wahrscheinlich in der Lage sein, das Szenenzentrum jeder Kachel basierend darauf zu erhalten (und ihre Breite/Höhe und die Anzahl der Spalten/Zeilen zu kennen). – ckid

+1

Warum benutzen Sie kein TilePane? –

+0

versuchte TilePane jetzt. Soweit ich das beurteilen kann, erlaubt es nicht mehr als 1 Knoten zu einer einzelnen Position hinzuzufügen. Wird mit TilePane der Bildschirm/die Szene x, y von Kindern möglich oder einfacher? – ckid

Verwandte Themen