在普通 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

如何在javafx中创建一个弹出窗口[重复]

如何使用ObservableList在Javafx中创建折线图的BarChart

如何在 JavaFX 2.1 中创建模态窗口

如何在 javaFX 中创建具有左、中、右部分的工具栏?