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
中定义的构造函数


如果需要访问命令行参数,请使用。

的可能副本。但这意味着什么?我现在该怎么办?