Ajout d'un cadre à GridPane JavaFX
Je suis entrain de créer un jeu de plateau en JavaFX à l'aide de GridPane.
Il y a 7 différentes animations qui pourrait être placé dans chaque grille (cellule) de la grille.
D'abord la grille ressemble à ceci
J'ai testé l'ajout d'un simple cercle à l'avant de la programmation de mon animation des insertions. Et il semble que ce
Les nœuds ajoutés sont SubScenes qui comprennent la Chronologie de l'animation. Chaque cellule est de taille 40x40 et la SubScene taille est également 40x40.
La subscenes lorsqu'il est ajouté, obtenir sur le dessus de la gridpane frontières et il n'a pas l'air bon.
Ce que je peux faire en sorte que les nœuds sont ajoutés ci-dessous les lignes de la grille? c'est à dire les lignes du quadrillage sont au-dessus des nœuds.
Si il n'est pas possible avec GridPane, est-il autre chose que je peux utiliser?
classe, que j'exécute pour le jeu
class Game {
static GridPane grid;
public void start(final Stage stage) throws Exception {
int rows = 5;
int columns = 5;
stage.setTitle("Enjoy your game");
grid = new GridPane();
for(int i = 0; i < columns; i++) {
ColumnConstraints column = new ColumnConstraints(40);
grid.getColumnConstraints().add(column);
}
for(int i = 0; i < rows; i++) {
RowConstraints row = new RowConstraints(40);
grid.getRowConstraints().add(row);
}
grid.setOnMouseReleased(new EventHandler<MouseEvent> () {
public void handle(MouseEvent me) {
grid.add(Anims.getAnim(1), (int)((me.getSceneX() - (me.getSceneX() % 40)) / 40), (int)((me.getSceneY() - (me.getSceneY() % 40)) / 40)); //here the getAnim argument could be between 1-7
}
});
grid.setStyle("-fx-background-color: white; -fx-grid-lines-visible: true");
Scene scene = new Scene(grid, (columns * 40) + 100, (rows * 40) + 100, Color.WHITE);
stage.setScene(scene);
stage.show();
}
public static void main(final String[] arguments) {
Application.launch(arguments);
}
}
classe qui contient des animations, ici, je suis juste de créer un cercle
public class Anims {
public static SubScene getAnim(final int number) throws Exception {
Circle circle = new Circle(20, 20f, 7);
circle.setFill(Color.RED);
Group group = new Group();
group.getChildren().add(circle);
SubScene scene = new SubScene(group, 40, 40);
scene.setFill(Color.WHITE);
return scene;
}
}
- Votre question est impossible de répondre sans code: comment sommes-nous censés savoir ce que vous faites qui crée cet effet, sans voir comment vous l'avez mise en place? Créer un un minimum de reproductibles exemple qui montre le même comportement et de modifier une question à l'inclure.
- espérons que cette aide
- Il serait plus facile si vous avez posté une un minimum de reproductibles exemple, mais il y a assez de place pour voir ce qui ne va pas.
- Cette question est similaire (peut-être un doublon?) Comment faire pour créer une grille d'arrière-plan.
- À l'aide de sous-scènes, c'est un très remis solution pour ce faire, généralement sous scènes sont pour le mélange 2D/3D des scènes avec différents angles de caméra et d'éclairage (ce qui ne semble pas être ce que vous faites ici), vous pouvez probablement se débarrasser de la SubScenes de mise en place et la juste utilisation régulière contenant les nœuds tels que les Groupes de Volet sous-classes.
- remplacement de SubScenes avec Volets a bien fonctionné, merci
Vous devez vous connecter pour publier un commentaire.
Ne pas utiliser
setGridLinesVisible(true)
: le la documentation explicitement les états c'est pour debug uniquement.Au lieu de cela, placez un volet dans toutes les cellules de la grille (même vides), et le style de la fenêtre, pour que vous voyez les frontières. (Cela vous donne la possibilité de contrôler les frontières très soigneusement, de sorte que vous pouvez éviter la double frontières, etc.) Puis ajouter le contenu de chaque volet. Vous pouvez également enregistrer les écouteurs de souris avec le volet, ce qui signifie que vous n'avez pas à faire le vilain de math pour comprendre lequel la cellule a été cliqué.
Il est recommandé d'appliquer une bordure à une région de l'est de l'utilisation de CSS et un "imbriquée à l'arrière-plan" de la démarche. Dans cette approche, vous dessinez deux (ou plus) de fond en comble sur la région, avec différents encarts, donnant l'apparence d'une frontière. Ainsi, par exemple:
sera d'abord dessiner un fond noir avec aucun des encarts, et puis qui va dessiner un fond blanc avec des inserts de 1 pixel sur tous les côtés, donnant l'apparence d'une bordure noire de la largeur de 1 pixel. Même si cela peut sembler contre-intuitif, la performance de cette est (prétendument) mieux que la spécification de la frontière directement. Vous pouvez également spécifier une séquence de quatre valeurs pour les encarts pour chaque remplir, qui sont interprétés comme les incrustations sur le haut, à droite, en bas et à gauche, respectivement. Donc
a l'effet d'une bordure noire sur la droite et en bas, etc.
Je suis également pas sûr
SubScene
est ce que vous voulez vraiment, sauf si vous avez l'intention de fixation de caméras différentes pour chaque cellule. Si vous avez vraiment besoin d'un subscene, rendre le fond transparent pour éviter de tirer sur les bords de la cellule. Vous pouvez simplement ajouter leGroup
directement à chaque cellule (vous pourriez probablement juste ajouter le cercle, selon exactement ce dont vous avez besoin...).Quelque chose comme:
et le css:
Cette approche a été approuvée par @James_D dans le commentaire.
Simplement ajouter un H et V décalage d'un pixel de largeur et de laisser le volet grille de la couleur d'arrière-plan "briller" par:
Si le volet grille de la couleur d'arrière-plan s'étend de l'extérieur plus d'un pixel (qui va arriver si son parent est plus grand que lui-même), juste envelopper la grille dans un
Group
!