【问题标题】:Cannot launch a JavaFX Application on MacOS (using Java 8)无法在 MacOS 上启动 JavaFX 应用程序(使用 Java 8)
【发布时间】:2019-11-08 14:22:57
【问题描述】:

第一次使用 JavaFX,我正在尝试使用 Hello World! 窗口对其进行测试。

我在带有 Mojave 10.14.5 的 MacOS 上使用 Java 8(更新 211)和 Eclipse。

我正在做这个项目:

我将我认为需要的所有 JavaFX jar 放入构建路径(也许我缺少一些 jar?)。

我正在尝试使用以下代码使用 JavaFX 打开一个窗口:

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Test extends Application{
    public static void main(final String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Hello World!");
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello World!");
            }
        });

        StackPane root = new StackPane();
        root.getChildren().add(btn);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }
}

代码应该没问题,因为它适用于 Windows 和 Linux。

当我运行它时,下面的栏中会出现一个 java 项,如下所示:

我知道它已打开,因为它下面有一个小点,但我看不到任何窗口。此外,如果不关闭 eclipse 本身,我将无法关闭这个“一杯咖啡”项目。

编辑: 我从 IDE (Eclipse 4.9.0) 运行它。使用 Oracle 的 Java 8 (211)。我自己添加了引用的库,如果我尝试删除它们并将导入留在代码中,我会收到此错误:

Access restriction: The type 'Application' is not API (restriction on required library '/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/jfxrt.jar')

【问题讨论】:

  • 你是从 ide 还是从命令行运行它?
  • JavaFX 是 Java 8 的一部分。您是自己添加了引用的库,还是 Eclipse 自动添加了它们?你用的是什么java实现?是甲骨文的吗?你用的是什么 Eclipse 版本?
  • 代码从命令行正确运行,操作系统和JRE版本相同。
  • 我从 IDE (Eclipse 4.9.0) 运行它。使用 Oracle 的 Java 8 (211)

标签: java eclipse macos javafx


【解决方案1】:

问题解决了!问题出在包上:javafx-swt.jar

在 Eclipse IDE for Mac 中,当 Java 程序引用 SWT 时, IDE 会自动添加 VM 选项 -XstartOnFirstThread。多数情况 在这种情况下,这种自动添加很有帮助。但是,有一种情况 添加此 VM 选项时会导致问题,即使用 Eclipse 一个 SWT 应用程序的项目,它还包括一个或多个“纯” 不与 SWT 类互操作的 JavaFX 类。一个“纯” 从此类 Eclipse 项目启动的 JavaFX 应用程序将 挂起,因为它不期望 -XstartOnFirstThread。 (https://docs.oracle.com/javafx/2/swt_interoperability/jfxpub-swt_interoperability.htm)

在运行配置,参数选项卡中,您可以找到一个复选框,要求不要使用 -XstartOnFirstThread。取消选中它,它可以工作。

【讨论】:

  • 是的,但这也记录在我给你的上面的链接中。 (3.添加VM参数。警告:确保选项:使用SWT启动时使用-XstartOnFirstThread参数未选中。)
【解决方案2】:

您的配置不会以这种方式工作。你没有提供足够的细节来给你一个明确的答案,但这里有一些问题:

Oracle 的 Java8(适用于 Mac)已经包含 JavaFX,因此您添加的库要么是不需要的,要么更可能会混淆 VM。

如果您的 Java 是不包含 JavaFX 的 OpenJDK 8,那么您添加的库也毫无用处,因为它们看起来像 Java 11 或更高版本的库,并且与 Java 8 不兼容。

查看此处以找到适合您环境的正确设置:https://openjfx.io/openjfx-docs/

将这两行代码添加到您的 main 方法中,以便找出您在运行时实际使用的 Java 和 JavaFX 版本。

System.out.println("java.runtime.version: " + System.getProperty("java.runtime.version", "(undefined)"));
System.out.println("javafx.version: " + System.getProperty("javafx.version", "(undefined)"));

输出应该是这样的:

java.runtime.version: 1.8.0_212-b10
javafx.version: 8.0.212

【讨论】:

  • 我正在使用 Oracle 的 Java8,如果我尝试删除库,我得到了我在后期编辑中输入的错误,我想使用 Java 8 而不升级到 Java12
  • 我已经更新了上面的答案。看来您以某种方式破坏了系统设置。您的代码在我的装有 Oracle Java 8 的 Mac 上运行良好。
  • 谢谢,我尝试将 println 放在 main 中(在启动方法之前),但它没有打印任何内容
猜你喜欢
  • 2019-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
  • 2021-12-09
  • 2019-04-10
相关资源
最近更新 更多