第一次使用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项目:
我知道它已打开,因为它下面有一个小圆点,但我看不到任何窗口。而且,如果不关闭月食本身,就无法关闭“咖啡”项目。
编辑: 我正在从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')
答案 0 :(得分:0)
您的配置无法以这种方式工作。您没有提供足够的详细信息来给出确定的答案,但这是一些问题:
Oracle(适用于Mac)的Java8已经包含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
答案 1 :(得分:0)
问题解决了!问题出在以下软件包:javafx-swt.jar
在Mac的Eclipse IDE中,当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。取消选中它即可。