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?

Author: krambo, 2016-11-22

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.

 0
Author: fabian, 2016-11-22 14:34:07