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;
}
}