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:
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:
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.
1 answers
Quelques suggestions:
N'utilisez pas un
BorderPane
pour centrer un composant; utilisezStackPane
à cette fin.Pour imposer une taille de nœuds pour en suivre une autre, vous devez lier respectivement les tailles max/min/pref.
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,...).
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.