Avoir une pièce de damier aller à la tuile que vous voulez dans JavaFX?
Je suis en train de créer un jeu de type checker et bien que je puisse faire bouger les tuiles vers le haut, vers le bas, etc. chaque fois que vous cliquez dessus, quand il s'agit de cliquer sur la pièce puis de cliquer sur la tuile, je ne sais pas comment le faire fonctionner.
Voici les gestionnaires d'événements pour les pièces et le tableau
class CircleEventHandler implements EventHandler<MouseEvent>{
int Crow;
int Ccol;
@Override
public void handle(MouseEvent event) {
System.out.println("Mouse Clicked");
Circle c = (Circle)event.getSource();
Crow = gp.getRowIndex(c);
Ccol = gp.getColumnIndex(c);
System.out.println("row is " + Crow + " & col is " + Ccol);
gp.getChildren().remove(c);
}
}
class RectangleEventHandler implements EventHandler<MouseEvent>{
@Override
public void handle(MouseEvent event) {
Rectangle r = (Rectangle)event.getSource();
int row = gp.getRowIndex(r);
int col = gp.getColumnIndex(r);
System.out.println("row is " + row + " & col is " + col);
gp.add(c, row, col);
}
}
L'exécution de ce code m'obtiendra une exception de pointeur null et me pointera vers le "gp.add (c, row, col);" Dans le gestionnaire d'événements rectangle. Je ne sais pas comment faire fonctionner cela, quelqu'un peut-il me pointer dans la bonne direction?
1 answers
Vous pouvez par exemple créer des classes internes à ces classes de gestionnaire et enregistrer les données dans l'instance englobante pour que cela fonctionne.
L'exemple suivant montre uniquement comment recolorer des rectangles en fonction de la couleur d'un cercle cliqué auparavant, mais il devrait montrer comment les informations peuvent être transmises.
public class Board {
public Board(GridPane grid) {
this.grid = grid;
}
private final GridPane grid;
private Circle selectedCircle;
public class CircleEventHandler implements EventHandler<MouseEvent> {
@Override
public void handle(MouseEvent event) {
// store info about circle clicked in enclosing instance
selectedCircle = (Circle) event.getSource();
}
}
public class RectangleEventHandler implements EventHandler<MouseEvent> {
@Override
public void handle(MouseEvent event) {
if (selectedCircle != null) {
// use field of enclosing instance to retrieve color of the circle
Rectangle r = (Rectangle) event.getSource();
r.setFill(selectedCircle.getFill());
selectedCircle = null;
}
}
}
}
@Override
public void start(Stage primaryStage) {
GridPane root = new GridPane();
root.addRow(0, new Circle(50, Color.GREEN), new Circle(50, Color.YELLOW), new Circle(50, Color.RED));
root.addRow(1, new Rectangle(50, 50), new Rectangle(50, 50), new Rectangle(50, 50));
Board board = new Board(root);
EventHandler<MouseEvent>[] handlers = new EventHandler[] {
board.new CircleEventHandler(),
board.new RectangleEventHandler()
};
for (Node n : root.getChildren()) {
n.setOnMouseClicked(handlers[GridPane.getRowIndex(n)]);
}
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.show();
}
Quant à trouver la source du NPE dans votre code: C'est impossible sans plus d'informations, car il n'y a aucune information sur pourquoi gp
est NULL.