【发布时间】:2022-01-14 00:24:00
【问题描述】:
我正在编写一个扩展 javafx 应用程序类的 java 类,并尝试将对象传递给构造函数,如下所示:
public class SceneWindow extends Application{
private int x;
private int y;
private int textX;
private int textY;
private static ImagePattern img;
public String title;
private ArrayList<EventHandler<MouseEvent>> events = new ArrayList<EventHandler<MouseEvent>>();
private Text mainDialogue = new Text(0, 0, "test");
private int eventIndex = 0;
public SceneWindow(SceneManager sm){
x = sm.getWindowX();
y = sm.getWindowY();
textX = sm.getTextX();
textY = sm.getTextY();
img = sm.getBackground();
title = sm.getTitle();
events = sm.getEvents();
mainDialogue.setText(sm.getText());
}
我正在创建这样的 SceneWindow 实例:
SceneWindow sw = new SceneWindow(sm);
sm 是 SceneManager 对象。
但是这不起作用。我在别处读到,这是因为您无法在 javafx 构造函数中使用非零参数。
这是我收到的错误消息:
Exception in Application constructor
Exception in thread "main" java.lang.RuntimeException: Unable to construct Application instance: class application.SceneWindow
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:891)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:196)
at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.NoSuchMethodException: application.SceneWindow.<init>()
at java.base/java.lang.Class.getConstructor0(Class.java:3585)
at java.base/java.lang.Class.getConstructor(Class.java:2271)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:802)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:484)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456)
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:184)
... 1 more
我该如何解决这个问题?
【问题讨论】:
-
是的,看起来它需要一个非 arg 构造函数,所以先创建一个,然后创建一些 setter,然后再创建一些其他 init 方法?
-
无论如何,你永远不会实例化
Application类;你将如何使用这个构造函数?为什么不在start()方法中创建SceneManager实例? -
@James_D 是当我运行
SceneWindow sw = new SceneWindow(sm);时未实例化的Application类,因为SceneWindow扩展了Application?在我实例化一个 SceneManager 实例之后,我在将它传递到 SceneWindow 之前与它进行交互。如果我在 start() 中实例化它,它将是空的。 -
@ErgonomicGrip 会的,但你永远不应该那样做。
Application类在您启动应用程序时为您实例化,您应该只有一个Application实例。 -
正如我在之前的评论中所说,当您调用
Application.launch(…)时,会创建您的Application类的实例。所以如果你自己实例化它,你至少有两个实例。拥有一个以管理应用程序生命周期为全部目的的类的两个实例是没有意义的。