首页 > 解决方案 > 应用程序结构中的异常

问题描述

我正在为一个面向对象的程序创建一个 GUI 程序,该程序将从迷宫中的坐标中找到一种方法。该程序本身可以在没有 gui 程序的情况下工作,但是当尝试将 GUI 添加到程序时我将无法工作。我正在使用 Intellij 并且有 java14 和 javafx14。我添加了以下 VM 选项(--module-path

C:\Users\Simen\Documents\Informatikk\IN1010\javafx-sdk-14.0.1\lib
--add-modules
javafx.controls,javafx.fxml
--add-exports
javafx.graphics/com.sun.javafx.sg.prism=ALL-UNNAMED)

还为项目结构添加了 JDK 和 SDK 库。

这是我收到的例外情况:

    Exception in Application constructor
Exception in thread "main" java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)
Caused by: java.lang.RuntimeException: Unable to construct Application instance: class SkrivHei
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:890)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
    at java.base/java.lang.Thread.run(Thread.java:832)
Caused by: java.lang.NoSuchMethodException: SkrivHei.<init>()
    at java.base/java.lang.Class.getConstructor0(Class.java:3427)
    at java.base/java.lang.Class.getConstructor(Class.java:2165)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:801)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
    at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
    ... 1 more

这是我使用的以下代码:

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.stage.FileChooser;
import javafx.scene.layout.GridPane;
import java.io.File;
import javafx.scene.shape.Rectangle;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.input.MouseEvent;
import javafx.event.EventHandler;
import javafx.scene.control.Button;
import javafx.scene.layout.Pane;

class GUILabyrint extends Application{
    private Rute[][] rutenett;
    private Labyrint labyrint = null;
    private Rectangle[][] rutenettGUI;
    private Stage stage;

    public class LosningKnapp implements EventHandler<MouseEvent> {
        int kolonneGUI, radGUI;
        boolean [][] utvei = null;

        public LosningKnapp(int radGUI, int kolonneGUI, boolean[][] utvei) { // Trykk på losningknapp
            this.radGUI = radGUI;
            this.kolonneGUI = kolonneGUI;
            this.utvei = utvei;
        }

        public void handle(MouseEvent e) {
            resett();
            for(int i = 0; i < labyrint.rad; i++){
                for(int j = 0; j < labyrint.kolonne; j++) {
                    Color color = Color.GREEN;
                    if (utvei[i][j]){
                        rutenettGUI[j][i].setFill(color);
                    }
                }
            }
        }
    }

    public class Trykk implements EventHandler<MouseEvent> {

        int kolonneGUI, radGUI;

        Trykk(int radGUI, int kolonneGUI) {
            this.radGUI = radGUI;
            this.kolonneGUI = kolonneGUI;
        }
        @Override
        public void handle(MouseEvent e) {  // Håndterer trykk på rute
            Liste<String> liste = null;
            try {
                liste = labyrint.finnUtveiFra(kolonneGUI, radGUI);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
            Liste<boolean [][]> losningsliste = new NyLenkeliste<>();
            if (liste.stoerrelse() > 0){
                for (int i = 0 ; i < liste.stoerrelse() ; i ++) {
                    boolean [][] utvei = Labyrint.losningKonvert(liste.hent(i));
                    losningsliste.leggTil(utvei);
                    resett();
                }

                losningsViser(radGUI, kolonneGUI, losningsliste);
            }

            else {
                System.out.println("Ingen utveier.");
            }
        }
    }

    public void start(Stage primaryStage) {
        this.stage = primaryStage;
        FileChooser fil = new FileChooser();
        fil.setInitialDirectory(new File("."));
        File file = fil.showOpenDialog(stage);
        try {
            labyrint = Labyrint.lesFraFil(file);
        } catch (Exception e) {
            System.out.println("Fant ingen fil aa aapne");
        }
        rutenett = labyrint.hentRutenett();
        rutenettGUI = new Rectangle[labyrint.rad][labyrint.kolonne];
        GridPane labGrid = new GridPane();
        Rectangle rute;
        for(int i = 0; i < labyrint.rad; i++){
            for(int j = 0; j < labyrint.kolonne; j++) {
                Color color = rutenett[j][i] instanceof HvitRute ? Color.WHITE : Color.BLACK;
                rute = new Rectangle (20, 20, color);
                Button button = new Button("", rute);
                rutenettGUI[j][i] = rute;
                labGrid.add(button, i, j);
                Trykk trykk = new Trykk(i, j);
                button.setOnMouseClicked(trykk);
            }
        }
        Scene scene = new Scene(labGrid);
        stage.setScene(scene);
        stage.show();
    }

    public void resett() {
        for(int i = 0; i < labyrint.rad; i++){
            for(int j = 0; j < labyrint.kolonne; j++) {
                Color color = rutenett[j][i] instanceof HvitRute ? Color.WHITE : Color.BLACK;
                rutenettGUI[j][i].setFill(color);
            }
        }
    }

    public void losningsViser(int radGUI, int kolonneGUI, Liste<boolean[][]> losninger) {
        GridPane labGrid = new GridPane();
        Rectangle rute;
        for(int i = 0; i < labyrint.rad; i++){
            for(int j = 0; j < labyrint.kolonne; j++) {
                Color color = rutenett[j][i] instanceof HvitRute ? Color.WHITE : Color.BLACK;
                rute = new Rectangle (20, 20, color);
                Button button = new Button("", rute);
                rutenettGUI[j][i] = rute;
                labGrid.add(button, i, j);
                Trykk trykk = new Trykk(i, j);
                button.setOnMouseClicked(trykk);
            }
        }
        Pane kulisser = new Pane();
        kulisser.setPrefSize(500, 450);
        kulisser.getChildren().add(labGrid);
        int i = 1;
        int x = 20;
        for (boolean[][] losning : losninger) {
            Button losningsknapp = new Button("Losning " + i);
            losningsknapp.setLayoutX(x); losningsknapp.setLayoutY(400);
            LosningKnapp los = new LosningKnapp(radGUI, kolonneGUI, losning);
            losningsknapp.setOnMouseClicked(los);
            kulisser.getChildren().add(losningsknapp);
            x = x + 80;
            i ++;
        }

        Scene scene = new Scene(kulisser);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

}

标签: javajavafx

解决方案


推荐阅读