Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX11:IllegalAccessError在创建标签时出错_Java_Intellij Idea_Javafx_Javafx 11 - Fatal编程技术网

JavaFX11:IllegalAccessError在创建标签时出错

JavaFX11:IllegalAccessError在创建标签时出错,java,intellij-idea,javafx,javafx-11,Java,Intellij Idea,Javafx,Javafx 11,这个问题可能与问题相同,但似乎询问者没有添加足够的信息以获得有用的回答 我正在尝试使用JDK和JavaFXSDK版本11.0.2运行JavaFx应用程序 此代码完全按照预期工作,生成一个空窗口: 导入javafx.application.application; 导入javafx.scene.scene; 导入javafx.scene.layout.StackPane; 导入javafx.stage.stage; 公共类主扩展应用程序{ public void start(Stage prima

这个问题可能与问题相同,但似乎询问者没有添加足够的信息以获得有用的回答

我正在尝试使用JDK和JavaFXSDK版本11.0.2运行JavaFx应用程序

此代码完全按照预期工作,生成一个空窗口:

导入javafx.application.application;
导入javafx.scene.scene;
导入javafx.scene.layout.StackPane;
导入javafx.stage.stage;
公共类主扩展应用程序{
public void start(Stage primaryStage)引发异常{
StackPane root=新的StackPane();
设置场景(新场景(根,420,420));
primaryStage.show();
}
公共静态void main(字符串[]args){
发射(args);
}
}
但是,如果我尝试将标签添加到
堆栈窗格
,则会引发异常

导入。。。
导入javafx.scene.control.Label;
公共类主扩展应用程序{
public void start(Stage primaryStage)引发异常{
StackPane root=新的StackPane();
root.getChildren().add(新标签(“42”);
设置场景(新场景(根,420,420));
primaryStage.show();
}
公共静态void main(字符串[]args){
发射(args);
}
}
它生成的堆栈跟踪如下所示(Main中的第13行是创建标签的位置):

我没有修改任何VM选项


如何修复此错误?这是JavaFx中的一个bug吗?

您已经在解释您的问题:

我没有修改任何VM选项

由于JavaFX11不再是JDK的一部分,因此您必须使用来自的JavaFXSDK(正如您正在做的那样),或者使用Maven/Gradle从Maven Central检索JavaFX模块

然后需要将SDK添加为库,以便IntelliJ可以找到JavaFX类

但是,一旦您完成了这项工作,并且考虑到javafxjar是模块,您仍然需要做两件事:

  • 使JavaFX模块可用于您的模块路径
  • 定义要添加到项目中的模块
根据IntelliJ输出,默认情况下添加
javafx.graphics
javafx.base

--add-modules javafx.base,javafx.graphics

-p /usr/lib/jvm/javafx-sdk-11.0.2/lib/javafx.base.jar
:/usr/lib/jvm/javafx-sdk-11.0.2/lib/javafx.graphics.jar
(请注意,
-p
--模块路径
相同)

这解释了为什么在第一种情况下,当您没有将控件添加到场景中时,您的项目会运行,而只有属于
javafx.graphics
StackPane
,但是当您添加属于
javafx.controls
标签时,会出现发布的异常而失败

这已经说过很多次了:您需要为您的项目设置所需的VM选项

首先阅读IDE非模块化项目部分的文档,包括文档。阅读第四部分。添加虚拟机选项

因此,单击运行->编辑配置,然后添加:

-p /usr/lib/jvm/javafx-sdk-11.0.2/lib --add-modules javafx.controls
应用并运行,问题将得到解决。

检查JAVA\u主页,
JAVA_HOME的版本必须是jdk9+或jdk11+

我会使用gradle和javafx插件

apply plugin: "org.openjfx.javafxplugin"

javafx {
    version = "11"
    modules = ["javafx.base", "javafx.controls", "javafx.graphics"
}

另一个选项可能很有用,特别是如果您计划将应用程序打包为fat jar

多亏了

您可以创建另一个不扩展
javafx.application.application
Main
类,而不是修改vm选项,并从那里调用应用程序启动方法。请尝试以下操作:

公共类应用程序扩展应用程序
{
@覆盖公共无效开始(阶段)
{
//所有必要的东西
}
//方法称为“main”,用于实验目的。
//但对于生产用途,您可能会决定将其称为“运行”。
//确切的名字并不重要。
公共静态void main(字符串[]args)
{
App.launch();
}
}
//此类不能扩展应用程序。这只是一个包装。
公开课跑者
{
公共静态void main(字符串[]args)
{
//上一个类中的Starter方法
App.main(args);
}
}
尝试使用默认配置运行
App.main()
VM options
为空字段)将导致错误,而
Runner.main()
将成功执行


为了更深入地理解,您可以比较run或Debug窗口中的java run命令(默认情况下,idea会折叠这些命令)。

有没有一种方法可以在不指定VM选项的情况下执行相同的操作?@user2914191Execute
javafx:run
,而不是从Maven窗口下载javafx SDK或库,另一个选项是使用包含JavaFX/OpenJFX库的JDK。至少有两个这样的产品:BellSoft的LibericaFX和Azul Systems的Azul Platform Core JDK FX版本。在使用模块运行时,不得使用
类路径
声明,反之亦然。
-p /usr/lib/jvm/javafx-sdk-11.0.2/lib --add-modules javafx.controls
apply plugin: "org.openjfx.javafxplugin"

javafx {
    version = "11"
    modules = ["javafx.base", "javafx.controls", "javafx.graphics"
}