Javafx 8 Monopoly mise en page de la carte avec l'image au centre de la carte


Je fais un jeu monopoly en utilisant javafx 8 et je suis tombé sur un problème qui me tient occupé depuis quelques heures. J'utilise la classe suivante pour rendre la vue de mon gameboard:

public class SpelbordView extends GridPane {
    public Pane[] panes = new Pane[40];


    public SpelbordView() {
        initNodes();
        layoutNodes();
    }

    private void initNodes(){
    }

    private void layoutNodes(){
        RowConstraints rowsEdge = new RowConstraints();
        rowsEdge.setPercentHeight(14);
        RowConstraints rowsMid = new RowConstraints();
        rowsMid.setPercentHeight(8);

        ColumnConstraints colEdge = new ColumnConstraints();
        colEdge.setPercentWidth(14);

        ColumnConstraints colMid = new ColumnConstraints();
        colMid.setPercentWidth(8);

        this.getColumnConstraints().addAll(colEdge, colMid,
                colMid, colMid, colMid, colMid, colMid, colMid, colMid, colMid, colEdge);
        this.getRowConstraints().addAll(rowsEdge, rowsMid,
                rowsMid,rowsMid,rowsMid,rowsMid,rowsMid,rowsMid, rowsMid,rowsMid, rowsEdge);



        BorderPane image = new BorderPane();
        this.add(image,1,1,9,9);

        image.maxHeightProperty().bind(this.heightProperty().multiply(0.72));
        image.maxWidthProperty().bind(this.widthProperty().multiply(0.72));



        ImageView imageView = new ImageView("monopoly/view/beginscherm/images/mlogo.png");
        imageView.setPreserveRatio(true);
        imageView.fitWidthProperty().bind(image.widthProperty().divide(2));
        imageView.autosize();

        image.setBackground(new Background(new BackgroundFill(MonopolyGUIItems.getMonopolyRed(),null,null)));
        image.setCenter(imageView);


        GridPane.setHalignment(image, HPos.CENTER);
        GridPane.setValignment(image, VPos.CENTER);


        BorderPane.setAlignment(image, Pos.CENTER);

        this.setGridLinesVisible(true);


        image.setPrefSize(getHeight()*0.72, getWidth()*0.72);
        image.autosize();

    }


}

Cela fonctionne presque parfait. Mais quand je mets la vue sur une scène, quelque chose ne va pas.

Lorsque je démarre l'application, la scène ressemble à ceci: Monopole mal rendu

Comme vous pouvez le voir, le borderpane dans lequel j'ai mis l'image, chevauche les autres grilles. Cela ne devrait pas être happening. Ce qui est étrange, c'est que lorsque je redimensionne manuellement un peu la fenêtre, le borderpane ajuste immédiatement ses dimensions pour s'adapter au centre du gridpane comme ci-dessous:

corriger monopole 1 entrez la description de l'image ici entrez la description de l'image ici

Est-ce que quelqu'un sait ce qui cause cela? Ou tout ce qui manque dans mon code. Comme je l'ai dit, les dimensions du borderpane ne sont fausses que lorsque la scène est rendue pour la première fois. Chaque fois que je redimensionne manuellement la scène le borderpane au centre se redimensionne parfaitement, peu importe les dimensions que je choisis.

Author: Mahen Vermeulen, 2016-02-25

1 answers

Quelques suggestions:

  1. N'utilisez pas un BorderPane pour centrer un composant; utilisez StackPane à cette fin.

  2. Pour imposer une taille de nœuds pour en suivre une autre, vous devez lier respectivement les tailles max/min/pref.

  3. Utilisez les commentaires pour expliquer la raison d'être du choix des valeurs de nombres apparemment magiques que vous avez choisies (8,14,9,0.72,...).

  4. Veuillez fournir des exemples entièrement autonomes et exécutables. Cela rend plus facile pour les autres d'aider vous.

Voici une version améliorée:

private void layoutNodes()
{
  final RowConstraints rowsEdge = new RowConstraints();
  rowsEdge.setPercentHeight( 14 );
  final RowConstraints rowsMid = new RowConstraints();
  rowsMid.setPercentHeight( 8 );

  final ColumnConstraints colEdge = new ColumnConstraints();
  colEdge.setPercentWidth( 14 );

  final ColumnConstraints colMid = new ColumnConstraints();
  colMid.setPercentWidth( 8 );

  this.getColumnConstraints().addAll( colEdge, colMid, colMid, colMid, colMid, colMid, colMid, colMid, colMid, colMid, colEdge );
  this.getRowConstraints().addAll( rowsEdge, rowsMid, rowsMid, rowsMid, rowsMid, rowsMid, rowsMid, rowsMid, rowsMid, rowsMid, rowsEdge );

  final StackPane imagePane = new StackPane();
  this.add( imagePane, 1, 1, 9, 9 );

  final DoubleBinding multipliedHeight = this.heightProperty().multiply( 0.72 );
  final DoubleBinding multipliedWidth = this.widthProperty().multiply( 0.72 );

  imagePane.maxHeightProperty().bind( multipliedHeight );
  imagePane.maxWidthProperty().bind( multipliedWidth );
  imagePane.minHeightProperty().bind( multipliedHeight );
  imagePane.minWidthProperty().bind( multipliedWidth );
  imagePane.prefHeightProperty().bind( multipliedHeight );
  imagePane.prefWidthProperty().bind( multipliedWidth );

  final ImageView imageView =
    new ImageView( "http://1.bp.blogspot.com/-Wjc79oqi1y0/VHitLAU44BI/AAAAAAAAG80/0UZ9n2JmvEo/s1600/Logo%2BMonopoly.png" );
  imageView.setPreserveRatio( true );
  imageView.fitWidthProperty().bind( imagePane.widthProperty().divide( 2 ) );

  imagePane.setStyle( "-fx-background-color: red;" );
  imagePane.getChildren().add( imageView );

  this.setGridLinesVisible( true );
}

Exemple Complet peut être trouvé ici.

 3
Author: Oliver Jan Krylow, 2016-02-26 08:11:50