JavaFX从不同类启动应用程序

JavaFX从不同类启动应用程序,java,javafx-8,Java,Javafx 8,编辑:我现在通过将JavaFxWindow设置为一个公共类来解决这个问题。 但是,当您公开一个类时,它必须存在于它自己命名的*.java源文件中。如果两个类都可以存在于同一个文件中,是否有解决方案 我正在尝试从另一个类启动JavaFX应用程序。通常,我们从应用程序类本身调用启动,启动JavaFX应用程序 但是,如果我想制作一个程序,让用户可以选择显示JavaFX窗口,还是显示Swing窗口呢 这是我的理解力所能达到的极限: package org.requiredinput.aitoopwj5e

编辑:我现在通过将
JavaFxWindow
设置为一个公共类来解决这个问题。
但是,当您公开一个类时,它必须存在于它自己命名的
*.java
源文件中。如果两个类都可以存在于同一个文件中,是否有解决方案

我正在尝试从另一个类启动JavaFX应用程序。通常,我们从
应用程序
类本身调用
启动
,启动JavaFX应用程序

但是,如果我想制作一个程序,让用户可以选择显示JavaFX窗口,还是显示Swing窗口呢

这是我的理解力所能达到的极限:

package org.requiredinput.aitoopwj5e;

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Group;
import javafx.scene.Scene;

class ch2q17 {
    public static void main(String[] argv) {

        char userInput;

        System.out.println("Please choose either Swing window [s], " +
                "or JavaFX window [f] ... ");

        JavaFxWindow myWindow = new JavaFxWindow();
        myWindow.main(argv);
        //myWindow.launch(argv);

    }
}

class JavaFxWindow extends Application {
    public static void main(String[] argv) {
        Application.launch(argv);
    }

    @Override
    public void start(Stage primaryStage) {
        Group root = new Group();
        primaryStage.setScene(new Scene(root, 1024, 768));
        primaryStage.setTitle("Test Window");
        //root.getChildren().add(vb);
        System.out.println("Showing stage...");
        primaryStage.show();

    }
}  
但它抛出了许多令人兴奋的错误:

% java -cp bin/test org.requiredinput.aitoopwj5e.ch2q17
Please choose either Swing window [s], or JavaFX window [f] ... 
Exception in Application constructor
Exception in thread "main" java.lang.RuntimeException: Unable to construct Application instance: class org.requiredinput.aitoopwj5e.JavaFxWindow
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:907)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$152(LauncherImpl.java:182)
    at com.sun.javafx.application.LauncherImpl$$Lambda$2/1595428806.run(Unknown Source)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NoSuchMethodException: org.requiredinput.aitoopwj5e.JavaFxWindow.<init>()
    at java.lang.Class.getConstructor0(Class.java:3082)
    at java.lang.Class.getConstructor(Class.java:1825)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$158(LauncherImpl.java:818)
    at com.sun.javafx.application.LauncherImpl$$Lambda$51/236498957.run(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$172(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl$$Lambda$53/991256019.run(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$null$170(PlatformImpl.java:295)
    at com.sun.javafx.application.PlatformImpl$$Lambda$55/87321364.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$171(PlatformImpl.java:294)
    at com.sun.javafx.application.PlatformImpl$$Lambda$54/1460563668.run(Unknown Source)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
    at com.sun.glass.ui.gtk.GtkApplication.lambda$null$48(GtkApplication.java:139)
    at com.sun.glass.ui.gtk.GtkApplication$$Lambda$43/1350641094.run(Unknown Source)
    ... 1 more
%java-cp-bin/test org.requiredinput.aitoopwj5e.ch2q17
请选择Swing窗口[s]或JavaFX窗口[f]。。。
应用程序构造函数中的异常
线程“main”java.lang.RuntimeException中出现异常:无法构造应用程序实例:class org.requireInput.aitoopwj5e.JavaFxWindow
位于com.sun.javafx.application.LaunchImpl.launchApplication1(LaunchImpl.java:907)
在com.sun.javafx.application.launchempl.lambda$launchApplication$152(launchempl.java:182)
位于com.sun.javafx.application.LaunchImpl$$Lambda$2/1595428806.run(未知源)
运行(Thread.java:745)
原因:java.lang.NoSuchMethodException:org.requireInput.aitoopwj5e.JavaFxWindow。()
位于java.lang.Class.getConstructor0(Class.java:3082)
位于java.lang.Class.getConstructor(Class.java:1825)
在com.sun.javafx.application.launchempl.lambda$launchApplication1$158(launchempl.java:818)
位于com.sun.javafx.application.launchempl$$Lambda$51/236498957.run(未知来源)
位于com.sun.javafx.application.PlatformImpl.lambda$runAndWait$172(PlatformImpl.java:326)
位于com.sun.javafx.application.PlatformImpl$$Lambda$53/991256019.run(未知源)
位于com.sun.javafx.application.PlatformImpl.lambda$null$170(PlatformImpl.java:295)
位于com.sun.javafx.application.PlatformImpl$$Lambda$55/87321364.run(未知来源)
位于java.security.AccessController.doPrivileged(本机方法)
位于com.sun.javafx.application.PlatformImpl.lambda$runLater$171(PlatformImpl.java:294)
位于com.sun.javafx.application.PlatformImpl$$Lambda$54/14605638.run(未知源)
位于com.sun.glass.ui.invokelateDispatcher$Future.run(invokelateDispatcher.java:95)
在com.sun.glass.ui.gtk.GtkApplication.\u runLoop(本机方法)
位于com.sun.glass.ui.gtk.GtkApplication.lambda$null$48(GtkApplication.java:139)
位于com.sun.glass.ui.gtk.GtkApplication$$Lambda$43/1350641094.run(未知来源)
... 还有一个

我是一个初学者,毫无疑问,答案可能超出了我的理解范围,涉及到一些晦涩难懂的Java,所以请尝试用一种方式来解释这一点,让刚刚学会内部类是什么的人能够理解…

你可以把它变成一个内部静态类:

public class ch2q17 {

    public static class JavaFxWindow extends Application {

        @Override
        public void start(Stage primaryStage) throws Exception {
            Group root = new Group();
            primaryStage.setScene(new Scene(root, 1024, 768));
            primaryStage.setTitle("Test Window");
            //root.getChildren().add(vb);
            System.out.println("Showing stage...");
            primaryStage.show();
        }

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

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

编辑:我跳过了要选择的位置和要显示的UI部分,因为这是关于启动JavaFX应用程序的。

只需在单独的文件中定义所需的每个类。请注意,有一个函数使用
start
方法获取表示类的参数。因此,您可以:

AppLauncher.java:

public class AppLauncher {

    public static void main(String[] args) {
        if (args.length < 1 || 
            (! "S".equals(args[0].toUpperCase()) ||
            (! "F".equals(args[0].toUpperCase())) {
            System.out.println("Provide an argument of S for Swing or F for JavaFX");
            System.exit(1);
        }

        if ("S".equals(args[0].toUpperCase())) {
            SwingUtilities.invokeLater(() ->
                new SwingApplication().setVisible(true));
        } else {
            Application.launch(FXApplication.class, args);
        }
    }
}
FXApplication.java:

public class SwingApplication extends JFrame {
    public SwingApplication() {
        // set up UI etc...
    }
}
public class FXApplication extends Application {

    @Override
    public void start(Stage primaryStage) {
        // etc...
    }
}

我也会问,但我不想混淆我的问题:从
ch2q17
JavaFxWindow
传递参数以设置其高度是否容易?你可以向传递到JavaFxWindow.main()调用中的数组添加参数,更好的说法是,您需要将数组的副本创建为一个新的数组,该数组具有原始大小加上要传入并添加的参数。调用main时,您还没有JavaFxWindow对象,这将由该调用创建。哇。我得花点时间才能弄明白。谢谢我打算尝试重写
JavaFxWindow
”构造函数,但这可能会破坏某些东西并阻止应用程序工作。为什么要在同一个文件中定义这些类?这太棒了+1对于重载方法!