编辑:我现在通过将JavaFxWindow
作为公共课来解决这个问题
但是,当你公开一个类时,它必须存在于自己命名的*.java
源文件中。是否有以下解决方案,两个类可以存在于同一个文件中?
我正在尝试从另一个类启动JavaFX应用程序。通常,我们从launch
类本身调用Application
来启动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,毫无疑问,所以请尝试以某种方式来解释这一点,只有那些只是学习了内在类的人才能理解...
答案 0 :(得分:2)
只需在单独的文件中定义所需的每个类。请注意,有一个overloaded version of Application.launch
采用表示具有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);
}
}
}
SwingApplication.java:
public class SwingApplication extends JFrame {
public SwingApplication() {
// set up UI etc...
}
}
FXApplication.java:
public class FXApplication extends Application {
@Override
public void start(Stage primaryStage) {
// etc...
}
}
答案 1 :(得分:1)
你可以把它变成一个内部静态类:
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应用程序。