0

Hello so I'nm trying to make a Connect 4 game using JavaFX and MVC, but I have a problem with handing over my View to my Controller.

ERROR I'M GETTING:

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
    at de.medieninformatik.prog2.ConnectView$1.handle(ConnectView.java:51)
    at de.medieninformatik.prog2.ConnectView$1.handle(ConnectView.java:47)
    at com.sun.javafx.event.CompositeEventHandler$NormalEventFilterRecord.handleCapturingEvent(CompositeEventHandler.java:282)
    at com.sun.javafx.event.CompositeEventHandler.dispatchCapturingEvent(CompositeEventHandler.java:98)
    at com.sun.javafx.event.EventHandlerManager.dispatchCapturingEvent(EventHandlerManager.java:223)
    at com.sun.javafx.event.EventHandlerManager.dispatchCapturingEvent(EventHandlerManager.java:180)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchCapturingEvent(CompositeEventDispatcher.java:43)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:52)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Scene$ClickGenerator.postProcess(Scene.java:3470)
    at javafx.scene.Scene$ClickGenerator.access$8100(Scene.java:3398)
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3766)
    at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
    at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:381)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:417)
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:416)
    at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
    at com.sun.glass.ui.View.notifyMouse(View.java:937)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
    at java.lang.Thread.run(Thread.java:745)

Main class

public class Main{
    public static void main(String[] args) {
        ConnectView view = new ConnectView();
        ConnectController control = new ConnectController(view);
    }
}

Controller Class (for data exchange between the view and the model)

import javafx.application.Application;
import javafx.scene.input.MouseEvent;

public class ConnectController {

    private ConnectView view;
    private ConnectModel model;

    public ConnectController(ConnectView view) {
        this.view = view;
        Application.launch(view.getClass());
    }

    public void handleChipPress(int x, int y){
        System.out.println(x + " " + y);
    }
}

View Class (Interface of the game, including events for clicking a chip)

public class ConnectView extends Application {
    private int FELD_SIZE;
    private int FELD_HEIGHT;
    private int FELD_WIDTH;
    private Group feldGroup = new Group();
    public ConnectController controller;

    public ConnectView(){
        this.FELD_SIZE = 100;
        this.FELD_HEIGHT = 6;
        this.FELD_WIDTH = 6;
    }

    public ConnectView(ConnectController controller){
        this.FELD_SIZE = 100;
        this.FELD_HEIGHT = 6;
        this.FELD_WIDTH = 6;
        this.controller = controller;
    }

    public void setController(ConnectController controller){
        this.controller = controller;
    }

    private Parent build(){
        Pane root = new Pane();
        root.setPrefSize(FELD_WIDTH * FELD_SIZE, FELD_HEIGHT * FELD_SIZE);
        root.getChildren().addAll(feldGroup);

        for (int y = 0;  y < FELD_HEIGHT; y++){
            for (int x = 0;  x < FELD_WIDTH; x++){
                Chip chip = new Chip(x, y);
                //feldGroup.getChildren().add(new Chip(x, y));
                chip.addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
                    @Override
                    public void handle(MouseEvent mouseEvent) {
                        chip.setS(Spieler.SPIELER);
                        controller.handleChipPress(chip.getX(), chip.getY());
                    }
                });
                feldGroup.getChildren().add(chip);
            }
        }
        return root;
    }

    @Override
    public void start(Stage stage) throws Exception {
        Scene scene = new Scene(build());
        stage.setTitle("Vier Gewinnt");
        stage.setScene(scene);
        stage.show();
    }
}

Chip Object as a clickable (Spieler Enum basically just defines the player who placed the chip + a color code)

public class Chip extends Circle {
    private Spieler s = Spieler.NONE;
    private int x;
    private int y;

    Chip(int x, int y){
        this.x = x;
        this.y = y;
        setFill(s.getC());
        setRadius((int)(Spielbrett.FELD_SIZE / 2));
        setCenterX(x * Spielbrett.FELD_SIZE + (int)Spielbrett.FELD_SIZE/2);
        setCenterY(y * Spielbrett.FELD_SIZE + (int)Spielbrett.FELD_SIZE/2);
    }

    public Spieler getS() {
        return s;
    }

    public void setS(Spieler s) {
        this.setFill(s.getC());
        this.s = s;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
}
  • read up on how to use application (don't instantiate it via it's constructor, launch is the method to call) - there are tons of examples and tutorials, start by reading at least one and follow its lead. – kleopatra Jul 03 '21 at 15:39

0 Answers0