MineSweeper Projekt: Testen nicht möglich

ZH1896ZH

Mitglied
Hallo allerseits,
Bin gerade an einem Minesweeper-Projekt für die Uni dran. Wir müssen das Projekt nach dem MVC-Modell programmieren, dies führt dazu dass ich Probleme habe die MenuBar (im View) zu testen (Fehlermeldungen en mass). Kann mir jemand erklären, wieso das Programm nicht ordnungsgemäss läuft? ich reiss mir nämlich gleich den Kopf aus.

Hier die 4 Klassen:

Main:


Java:
package minesweeper;

import javafx.application.Application;
import javafx.stage.Stage;

public class MineSweeperMVC extends Application {

    protected MineSweeperModel model;
    protected MineSweeperController controller;
    protected MineSweeperView view;
    protected Stage stage;
    

    public void start(Stage primaryStage) throws Exception {
        model = new MineSweeperModel();
        view = new MineSweeperView(stage, model);
        controller = new MineSweeperController(model, view, stage);
        
        view.start();
    }
    
    
    
    public static void main(String[] args) {
        launch();

    }
}

Controller:

Java:
package minesweeper;

import javafx.application.Platform;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.ButtonType;
import javafx.stage.Stage;

public class MineSweeperController {
    
    protected MineSweeperModel model;
    protected MineSweeperView view;
    protected Stage stage;

    protected MineSweeperController(MineSweeperModel model, MineSweeperView view, Stage stage) {
        this.model = model;
        this.view = view;
        this.stage = stage;
        
        //ActionEvents from MenuBar
        view.aboutItem.setOnAction(e -> {
            Alert aboutAlert = new Alert(AlertType.INFORMATION, "Created by Robin Roth, Robin Weis and Luca Schädler\n" + "v 0.1", ButtonType.CLOSE);// write the text
            aboutAlert.setTitle("About");
            aboutAlert.setHeaderText("MineSweeper");
            aboutAlert.showAndWait();
        });
        
        view.helpItem.setOnAction(e -> {
            Alert helpAlert = new Alert(AlertType.INFORMATION,
                    "The aim of minesweeper is to identify all the sqaures which contain mines.\n\n"
                            + "Left click on a square to reveal a number. This number indicates how many of the adjacent squares contain mines. By using these numbers you can deduce which sqaures contain mines. \n\n"
                            + "Right click on a square to mark it as containing a mine. You can right click the sqaure again to unmark it if you made a mistake.\n\n"
                            + "After all mines have successfully been marked the game is over and you win! Be careful though. Left clicking a square with a mine will result in a game over.", ButtonType.CLOSE);// write the text
            helpAlert.setTitle("Help");
            helpAlert.setHeaderText("How to play");
            helpAlert.showAndWait();
        });
        
        view.quitItem.setOnAction(e -> {
            Platform.exit();
        });
        
        view.smallSizeItem.setOnAction(e -> {
            MineSweeperView.gridSize = 10;
            model.reload();
        });
        
        view.smallSizeItem.setOnAction(e -> {
            MineSweeperView.gridSize = 15;
            model.reload();
        });

        view.smallSizeItem.setOnAction(e -> {
            MineSweeperView.gridSize = 20;
            model.reload();
        });
        
        view.easyItem.setOnAction(e -> {
            MineSweeperView.bombPercent = 10;
            model.reload();
        });
        
        //view.normalItem.setOnAction(e -> addBomb());//kann so mit event get source gemacht werden noch machen
        
        view.hardItem.setOnAction(e -> {
            MineSweeperView.bombPercent = 20;
            model.reload();
        });
        
        view.soundOnItem.setOnAction(e -> {
            MineSweeperView.sound = true;
        });
        
        view.soundOffItem.setOnAction(e -> {
            MineSweeperView.sound = false;
        });
        
    }

}

View:

Java:
package minesweeper;

import java.util.Timer;

import javafx.scene.Scene;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.control.RadioMenuItem;
import javafx.scene.control.ToggleGroup;
import javafx.scene.image.Image;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class MineSweeperView {

    protected Stage primaryStage;
    protected MineSweeperModel model;
    
    public static int gridSize = 10;
    public static int bombPercent = 10;
    public static boolean sound = true;
    public static Timer timer;
    public static int secondPassed;

    private VBox root = new VBox();
    protected MenuBar menuBar;
    protected Menu fileMenu, sizeMenu, difficultyMenu, soundMenu;
    protected MenuItem aboutItem, helpItem, quitItem,
                    smallSizeItem, mediumSizeItem, largeSizeItem,
                    easyItem, normalItem, hardItem;
    protected RadioMenuItem soundOnItem, soundOffItem;

    protected MineSweeperView(Stage primaryStage, MineSweeperModel model) {
        this.primaryStage = primaryStage;
        this.model = model;
        
        //Menu-Instanziierung
        menuBar = new MenuBar();
        fileMenu = new Menu("File"); sizeMenu = new Menu("Size"); difficultyMenu = new Menu("Difficulty");soundMenu = new Menu("Sound");
        aboutItem = new MenuItem("About"); helpItem = new MenuItem("help"); quitItem = new MenuItem("Quit");
        smallSizeItem = new MenuItem("10x10 (small)"); mediumSizeItem = new MenuItem("15x15 (medium)"); largeSizeItem = new MenuItem("20x20 (large)");
        easyItem = new MenuItem("Easy"); normalItem = new MenuItem("Normal"); hardItem = new MenuItem("Hard");
        soundOnItem = new RadioMenuItem("On"); soundOffItem = new RadioMenuItem("Off");
        
        fileMenu.getItems().addAll(aboutItem, helpItem, quitItem);
        sizeMenu.getItems().addAll(smallSizeItem, mediumSizeItem, largeSizeItem);
        difficultyMenu.getItems().addAll(easyItem, normalItem, hardItem);
        soundMenu.getItems().addAll(soundOnItem, soundOffItem);
        
        ToggleGroup soundToggle = new ToggleGroup();
        soundToggle.getToggles().addAll(soundOnItem, soundOffItem);
        soundToggle.selectToggle(soundOnItem);
        
        menuBar.getMenus().addAll(fileMenu,sizeMenu, difficultyMenu, soundMenu);
        
        root.getChildren().add(menuBar);
        
        //Szene instanziieren und an Stage weitergeben
        Scene scene = new Scene(root);
        scene.getStylesheets().add(getClass().getResource("MineSweeperStyle.css").toExternalForm());
        primaryStage.setScene(scene);
        primaryStage.setTitle("MineSweeper");
    }

    public void start() {//change to procteted after testing
        primaryStage.show();
    }

}

Model:


Java:
package minesweeper;

public class MineSweeperModel {
    

    
    public void reload() {//methode to reload after userklick
        
    }

}


Fehlermeldung:

Exception in Application start method
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$1(LauncherImpl.java:182)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
at minesweeper.MineSweeperView.<init>(MineSweeperView.java:83)
at minesweeper.MineSweeperMVC.start(MineSweeperMVC.java:16)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$7(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$5(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$6(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$4(WinApplication.java:186)
... 1 more
Exception running application minesweeper.MineSweeperMVC
 

mihe7

Top Contributor
Dann wird mit 99,9 %-iger Wahrscheinlichkeit die angegebene Ressource nicht gefunden. Gib mal das Paket als Pfad mit an, wo sich die CSS-Datei befindet. Je nach Build-System musst Du die Ressource auch in einem anderen Verzeichnisbaum (src/main/resources) ablegen.
 

ZH1896ZH

Mitglied
Dann wird mit 99,9 %-iger Wahrscheinlichkeit die angegebene Ressource nicht gefunden. Gib mal das Paket als Pfad mit an, wo sich die CSS-Datei befindet. Je nach Build-System musst Du die Ressource auch in einem anderen Verzeichnisbaum (src/main/resources) ablegen.
Du hast recht, wenn ich die Zeile auskommentiere funktioniert das Programm.
Kannst du mir noch sagen, wie ich den Pfad angeben muss? (siehe Screenshot)


1584476289785.png
 

mihe7

Top Contributor
Probier mal scene.getStylesheets().add(getClass().getResource("/MineSweeperStyle.css").toExternalForm());, also mit führendem Slash.
 

ZH1896ZH

Mitglied
Probier mal scene.getStylesheets().add(getClass().getResource("/MineSweeperStyle.css").toExternalForm());, also mit führendem Slash.
hab bisschen herumprobiert, so funktionierts:
Code:
scene.getStylesheets().add(getClass().getResource("/resources/MineSweeperStyle.css").toExternalForm());
das "/" - Zeichen am anfang hat gefehlt. Danke für Deine Hilfe mihe7!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Zeppi Swing Minesweeper Rekursiv AWT, Swing, JavaFX & SWT 12
T Minesweeper Interaktivität AWT, Swing, JavaFX & SWT 2
N Minesweeper: 2D Feld von JButtons anlegen AWT, Swing, JavaFX & SWT 19
Z Minesweeper clon kritik? AWT, Swing, JavaFX & SWT 3
MiMa JUnit5 im JavaFX Projekt AWT, Swing, JavaFX & SWT 2
B Java Projekt mit JavaFX und jfoenix ausführbar machen AWT, Swing, JavaFX & SWT 46
H JavaFX wie JavaFX Projekt aufsetzen? AWT, Swing, JavaFX & SWT 10
G JavaFX Code in neues Projekt übernehmen AWT, Swing, JavaFX & SWT 0
N JavaFX Javafx intelij Projekt zu ausführbaren jar Datei Machen AWT, Swing, JavaFX & SWT 1
Z GUI Forms - Mehrere Fenster in einem Projekt AWT, Swing, JavaFX & SWT 18
L FX-Projekt: fast leere Fensterausgabe ohne Fehlermeldung AWT, Swing, JavaFX & SWT 6
N JavaFX Projekt nachträglich zu JavaFX Application machen? AWT, Swing, JavaFX & SWT 1
ruutaiokwu SWT "Google Window Builder" tut keine jar's ins Projekt rein bei SWT-Projekt AWT, Swing, JavaFX & SWT 22
VPChief Eclipse: Projekt mit src ordner exportieren. AWT, Swing, JavaFX & SWT 76
Zrebna JavaFX-Projekt mit Bildern funktioniert nicht - um Hilfe wird gebeten AWT, Swing, JavaFX & SWT 14
N Ausführbare Datei aus JavaFX Projekt erstellen AWT, Swing, JavaFX & SWT 22
MiMa Java Projekt nach JavaFX convertieren AWT, Swing, JavaFX & SWT 4
M Java Gui Projekt, Würfelspiel AWT, Swing, JavaFX & SWT 2
Sam96 JavaFX mit Sqlite Projekt mit jar zu groß AWT, Swing, JavaFX & SWT 10
A Wie baue ich das Bus-System in ein Java Projekt ein? AWT, Swing, JavaFX & SWT 5
B Pong Projekt mit LWJGL Klassen exportieren AWT, Swing, JavaFX & SWT 14
C Hilfe beim programmieren mit studiumgebundenes Projekt AWT, Swing, JavaFX & SWT 1
J Frage zu Java Projekt [2D Game] AWT, Swing, JavaFX & SWT 3
Tom299 JavaFX Projekt-Struktur AWT, Swing, JavaFX & SWT 2
S Projekt: Meisterschaft - Abspeichern bereits gemachter Schritte AWT, Swing, JavaFX & SWT 2
M JavaFX MSI oder EXE aus JavaFX Projekt erstellen? AWT, Swing, JavaFX & SWT 2
Birke Swing Neue Swing LayoutManager: TOnion Projekt AWT, Swing, JavaFX & SWT 10
R JavaFX Mein SceneBuilder Projekt AWT, Swing, JavaFX & SWT 3
D Ambitioniertes Projekt - Brauche Stichworte AWT, Swing, JavaFX & SWT 4
M GUI-Projekt realisieren AWT, Swing, JavaFX & SWT 9
J Swing Window-Builder-Projekt richtig übertragen AWT, Swing, JavaFX & SWT 2
J Das erste Projekt und ein Haufen von Fragen. Der SudokuReader. AWT, Swing, JavaFX & SWT 4
D Java Projekt als Jar AWT, Swing, JavaFX & SWT 3
J jme neues projekt öffnen AWT, Swing, JavaFX & SWT 4
J Projekt Olympische Spiele AWT, Swing, JavaFX & SWT 12
F Netbeans Gui in BlueJ Projekt AWT, Swing, JavaFX & SWT 9
X Resourcen in Projekt einbinden AWT, Swing, JavaFX & SWT 7
R jFreeChart in eine NetBeans Projekt integrieren AWT, Swing, JavaFX & SWT 24
D Swing MVC in Projekt umsetzen AWT, Swing, JavaFX & SWT 71
D Swing Projekt Herangehensweise Swing AWT, Swing, JavaFX & SWT 6
N Swing Projekt - jar ausführen AWT, Swing, JavaFX & SWT 11
C Problem mit Swing Application Framework - Projekt beim AWT, Swing, JavaFX & SWT 2
W netbeans projekt in Eclipse importieren -gui teil geht nicht AWT, Swing, JavaFX & SWT 5
C Mein erstes kleines Swing-Projekt - Probleme AWT, Swing, JavaFX & SWT 8
M Einstellung des Projekt-Verzeichnis in NetBeans AWT, Swing, JavaFX & SWT 4
T Projekt - ChatClient - JEditorPane - Smilies, Vektor AWT, Swing, JavaFX & SWT 2
D Events, Listener, GUI . Größeres Projekt AWT, Swing, JavaFX & SWT 4
M java projekt als exe kompilieren. AWT, Swing, JavaFX & SWT 2
J Event Handling Input auf String testen, Fehlermeldung ausgeben AWT, Swing, JavaFX & SWT 4
F JavaFX JavaFX-Anwendungen testen AWT, Swing, JavaFX & SWT 1
K Testen von GUI-Applikationen AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen


Oben