java - 应用程序结构中的异常
问题描述
我正在为一个面向对象的程序创建一个 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);
}
}
解决方案
推荐阅读
- python-3.x - 与在 Python 中使用 if-then 语句相比,控制要执行哪些代码块的更好方法?
- powershell - 以精确的时间导出 Windows 日志
- java - 在 maven 和 java 9+ 中使用 java 自动模块 cdi.api
- postgresql - 在 PostgresSQL 中将整数转换为时间戳
- sql - 如何将存储在表中的符号传递给存储过程条件?
- javascript - 使用 JS 单击链接时更改 CSS 中的设置
- python - 如何让 Pygame time.delay() 在不冻结窗口的情况下运行?
- heroku - 我无法通过网络登录heroku,该怎么办?
- jquery - 使用 jQuery 将 HTML 添加到 iFrame 并查找类
- java - Using mockito to mock the entity manager and test a stateless EJB