Hey, also ich möchte ein Vier Gewinnt im Model View Controller Pattern mit JavaFX machen, aber habe damit einige Probleme (bin auch ziemlicher Anfänger was JavaFX angeht).
Der Fehler tritt immer dann auf wenn das MouseEvent ausgelöst wird und der Controller den Input verarbeiten soll.
Bei StackOverflow und YouTube habe ich leider keine Hilfe gefunden, vielleicht kann mir hier jemand helfen
Die Spieler Klasse enthält nur die Drei Spieler (SPIELER, BOT und NONE) und den Color Code für den Chip.
[CODE lang="java" title="Fehler Output"]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)[/CODE]
[CODE lang="java" title="Main-Klasse"]public class Main{
public static void main(String[] args) {
ConnectView view = new ConnectView();
ConnectController control = new ConnectController(view);
}
}[/CODE]
[CODE lang="java" title="Controller Klasse"]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);
}
}[/CODE]
View Klasse (mit JavaFX)
[CODE lang="java" title="View Klasse (mit JavaFX und MouseEvent)"]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();
}
}[/CODE]
[CODE lang="java" title="Chip Klasse"]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;
}
}[/CODE]
Der Fehler tritt immer dann auf wenn das MouseEvent ausgelöst wird und der Controller den Input verarbeiten soll.
Bei StackOverflow und YouTube habe ich leider keine Hilfe gefunden, vielleicht kann mir hier jemand helfen
Die Spieler Klasse enthält nur die Drei Spieler (SPIELER, BOT und NONE) und den Color Code für den Chip.
[CODE lang="java" title="Fehler Output"]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)[/CODE]
[CODE lang="java" title="Main-Klasse"]public class Main{
public static void main(String[] args) {
ConnectView view = new ConnectView();
ConnectController control = new ConnectController(view);
}
}[/CODE]
[CODE lang="java" title="Controller Klasse"]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);
}
}[/CODE]
View Klasse (mit JavaFX)
[CODE lang="java" title="View Klasse (mit JavaFX und MouseEvent)"]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();
}
}[/CODE]
[CODE lang="java" title="Chip Klasse"]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;
}
}[/CODE]