在普通 Java 应用程序中创建 JavaFX 初级阶段
Posted
技术标签:
【中文标题】在普通 Java 应用程序中创建 JavaFX 初级阶段【英文标题】:Create a JavaFX primary stage inside a normal Java application 【发布时间】:2013-01-26 22:42:45 【问题描述】:我有一个启动器和一个 JavaFX 类。启动器创建一个名为 JavaFXApplication1 的类。 JavaFXApplication 包含整个 JavaFX 代码(在本例中只是一个小示例),并且应该设置一个具有一个主要阶段的窗口。
启动器有静态主入口点——但我读到 JavaFX 并没有真正使用这个入口点。这解释了我的控制台输出(见帖子末尾)
我不知道这是否可能(启动器创建一个 JavaFX 窗口 - 入口点在表示类本身中是 not)。我不想使用预加载器(我认为预加载器只是用于启动期间的重载),因为启动器将整个程序表示为一个对象(演示、业务和持久性 - 一个 3 层程序)。入口点应该在演示类之外(在这个例子中是在启动器类中)
以下示例确实有效。但对我来说,这就像一块“黑魔法”
这是我的代码
启动器:
package javafxapplication1;
public class Launcher
public static void main(String[] args)
System.out.println("main()");
// Do some stuff and then create the UI class
JavaFXApplication1 client = new JavaFXApplication1();
client.caller(args);
JavaFXApplication1:
package javafxapplication1;
import javafx.application.Application;
import javafx.stage.Stage;
public class JavaFXApplication1 extends Application
@Override
public void start(Stage primaryStage)
System.out.println("start()");
primaryStage.setTitle("I am a JavaFX app");
primaryStage.show();
public void caller(String[] args)
System.out.println("caller()");
launch(args);
/* We call the main function from the client
public static void main(String[] args)
launch(args);
*/
程序的输出是:
start()
有没有办法创建这样的应用程序?谢谢
【问题讨论】:
main 方法并没有真正使用,这是 JFX 8.0 的一个特性:javafx-jira.kenai.com/browse/RT-27808 OR jbs.oracle.com/bugs/browse/JDK-8001533 感谢您的提示:第二个答案是:2)创建一个不从 javafx.application.Application 扩展的单独 Main 类并将该调用放入启动器(仅当您真的不能做你需要做的其他方式)。他是什么意思?这不是我的情况吗?可悲的是,我无法访问您的第二个链接(对我而言) @AlexanderKirov 与本文相关mail.openjdk.java.net/pipermail/core-libs-dev/2012-November/… 和您的提示我看到了问题。但我正在寻找一种解决方法(如果可能的话) 我尝试创建一个简单的 Java 应用程序(不是 JavaFX 应用程序,一切都按您的意愿工作:main() caller() start()。(JDK8 b76,NetBeans 7.3beta2) 嗯..那我搞错了。我创建了一个 java 项目,将一个 java 类(带有 main 方法)和 javafx 类(扩展应用程序)添加到项目中。 Netbeans 找不到 javafx 包(在 Kubuntu 下使用 Oracle JDK7 和 Windows 7 以及 Oracle JDK 7 时出现问题)。平台配置文件中启用了 JavaFX。 【参考方案1】:这个问题的答案是创建一个java项目而不是JavaFX项目。在此之后,您可以添加一个 JavaFX 主类并编写一个方法(调用 launch() )。
也许您必须从 /jdk_*/jre/lib 目录添加编译时库 deploy.jar、javaws.jar、jfxrt.jar 和 plugin.jar
【讨论】:
对此问题发表评论。如果您使用通常的 JavaApplication,将使用标准打包程序,并调用 main 方法。如果您创建 JavaFX 应用程序 - 将使用 javafxpackager 并忽略 main 方法,将通过 start(..) 方法调用扩展 Application 的类。这已通过开发者架构师验证。 评论问题中的代码:您应该使用“Application.launch(JavaFXApplication.class, args)”而不是创建新实例及其方法调用,因为新实例的创建将被忽略. 最后要说的是,如果您希望通过小程序或 Web 启动来分发您的应用程序,则不应使用 main 方法。【参考方案2】:我在 Running JavaFX Application instance in the main method of a class – MacDevign
这就是你要找的吗?
代码很长,所以最好参考帖子,但用法很简单。请注意,init 和 stop 方法不使用启动器线程,因此请谨慎使用。
目的是在您的类的主要方法上运行一个虚拟的 javafx 应用程序,以便进行快速测试/实验。
要使用它,只需使用 lambda 在 main 方法中添加以下内容,或者您可以使用匿名内部类样式。
// using the start method of Application class
Utility.launchApp((app, stage) ->
// javafx code
, arArgs);
【讨论】:
请不要提供仅链接的答案。至少包括对提议的解决方案的摘要,以防提供链接停止工作。以上是关于在普通 Java 应用程序中创建 JavaFX 初级阶段的主要内容,如果未能解决你的问题,请参考以下文章
如何在 IntelliJ IDEA 中创建 JavaFX Maven 项目?
如何使用 FXML 在 JavaFX 中创建 CheckBoxTreeItem