JavaFX:从另一个类启动
我想在我的JavaFX:从另一个类启动,java,javafx,Java,Javafx,我想在我的JavaFX应用程序中按照Model-View-Controller的概念进行编程,因此我将启动方法编码到GUI类中的视图包中。在这里您可以看到我的GUI类: public class GUIFalscherName extends Application { // Komplexe Datentypen //*********************************// VBox elternteil; Label testLabel; //******
JavaFX
应用程序中按照Model-View-Controller的概念进行编程,因此我将启动方法编码到GUI类中的视图包中。在这里您可以看到我的GUI类:
public class GUIFalscherName extends Application {
// Komplexe Datentypen
//*********************************//
VBox elternteil;
Label testLabel;
//*********************************//
public GUIFalscherName(String[] args) {
GUIFalscherName.launch(args);
}
public void start(Stage buehne) throws Exception {
buehne.setTitle("Test");
this.elternteil = new VBox();
this.testLabel = new Label();
this.testLabel.setText("test");
fuegeKomponenteDemParentHinzu(testLabel);
Scene scene = new Scene(elternteil);
buehne.setScene(scene);
buehne.show();
}
public void fuegeKomponenteDemParentHinzu(Node komponente) {
this.elternteil.getChildren().add(komponente);
}
}
在这里,您可以看到我的主类,我想在这里调用GUI类的构造函数,启动将在这里启动GUI
public class FalscherName {
public static void main(String[] args) {
GUIFalscherName guiFalscherName = new GUIFalscherName(args);
}
}
因此,我的目标是将主要部分从GUI部分中分离出来,而不是像模型-视图-控制器概念所说的那样将它们混合在一起
但是,当我运行代码时,会出现以下错误:
Exception in Application constructor
Exception in thread "main" java.lang.RuntimeException: Unable to construct Application instance: class de.falschername.view.GUIFalscherName
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:907)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$1(LauncherImpl.java:182)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NoSuchMethodException: de.falschername.view.GUIFalscherName.<init>()
at java.lang.Class.getConstructor0(Unknown Source)
at java.lang.Class.getConstructor(Unknown Source)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$7(LauncherImpl.java:818)
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
应用程序构造函数中的异常
线程“main”java.lang.RuntimeException中出现异常:无法构造应用程序实例:class de.falschername.view.GUIFalscherName
位于com.sun.javafx.application.LaunchImpl.launchApplication1(LaunchImpl.java:907)
在com.sun.javafx.application.launchempl.lambda$launchApplication$1(launchempl.java:182)
位于java.lang.Thread.run(未知源)
导致异常的原因:java.lang.NoSuchMethodException:de.falschername.view.GUIFalscherName。()
位于java.lang.Class.getConstructor0(未知源)
位于java.lang.Class.getConstructor(未知源)
在com.sun.javafx.application.launchempl.lambda$launchApplication1$7(launchempl.java:818)
位于com.sun.javafx.application.PlatformImpl.lambda$runAndWait$7(PlatformImpl.java:326)
位于com.sun.javafx.application.PlatformImpl.lambda$null$5(PlatformImpl.java:295)
位于java.security.AccessController.doPrivileged(本机方法)
位于com.sun.javafx.application.PlatformImpl.lambda$runLater$6(PlatformImpl.java:294)
位于com.sun.glass.ui.invokelateDispatcher$Future.run(invokelateDispatcher.java:95)
在com.sun.glass.ui.win.WinApplication.\u runLoop(本机方法)
位于com.sun.glass.ui.win.WinApplication.lambda$null$4(WinApplication.java:186)
... 还有一个
这里出了什么问题?请参见下面的java文档 启动一个独立的应用程序。此方法通常称为 来自main方法()。它不能被调用一次或多次 将引发异常。这相当于 在类所在的位置启动(class.class,args) 包含调用launch的方法的类<代码>它必须是一个 将抛出应用程序的子类或运行时异常 当我尝试从其他类调用时,出现以下错误:
Exception in thread "main" java.lang.RuntimeException: Error: class FalcherName is not a subclass of javafx.application.Application
at javafx.application.Application.launch(Application.java:254)
at FalcherName.main(FalcherName.java:5)
这是主要问题:
原因:java.lang.NoSuchMethodException:de.falschername.view.GUIFalscherName。()
这意味着它在GUIFalscherName
类中找不到无参数构造函数。这是意料之中的,因为您只有一个构造函数,它是:
public GUIFalscherName(字符串[]args){
GUIFalscherName.launch(args);
}
它只需要一个参数。无参数构造函数的需求由以下文件记录:
应用程序
子类必须声明为public,并且必须有一个公共的无参数构造函数[强调添加]
您对GUIFalscherName.launch(…)
的放置也不正确。当您通过launch
启动JavaFX应用程序时,JavaFX运行时将为您构建应用程序类的实例(使用反射)。由于您在构造函数中调用launch
,这意味着您正在创建一个实例,该实例导致创建一个不同的实例,而原始实例只是被垃圾收集。如果您想从一个独立的主类启动JavaFX,该类不是从应用程序继承的,那么您需要使用:
启动一个独立的应用程序。此方法通常从主方法调用。不能多次调用它,否则将引发异常
只有通过调用Platform.exit()
或关闭所有应用程序窗口退出应用程序,启动方法才会返回。appClass
参数指定的类必须是Application
的公共子类,在导出到(或open
)到至少javafx.graphics
模块的包中,具有公共无参数构造函数,否则将引发运行时异常
注意:处理导出/打开的包的部分与Java 9中添加的模块相关。如果您不是在用Java9+开发,或者没有使用模块,那么这一部分与您无关
例如:
导入javafx.application.application;
公共类FalscherName{
公共静态void main(字符串[]args){
Application.launch(GUIFalscherName.class,args);
}
}
您需要删除在GUIFalscherName
中定义的构造函数
如果需要访问命令行参数,请使用。的可能副本。但这意味着什么?我现在该怎么办?