Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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
JavaFX警告:不支持的JavaFX配置:类是从';未命名模块@…';_Java_Javafx - Fatal编程技术网

JavaFX警告:不支持的JavaFX配置:类是从';未命名模块@…';

JavaFX警告:不支持的JavaFX配置:类是从';未命名模块@…';,java,javafx,Java,Javafx,我只是下载了JavaFX并进行了设置,我没有做任何其他事情。我运行了示例代码,这是弹出的警告,尽管所有内容都已编译。我在用IntelliJ 这在Main.java中: package sample; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stag

我只是下载了JavaFX并进行了设置,我没有做任何其他事情。我运行了示例代码,这是弹出的警告,尽管所有内容都已编译。我在用IntelliJ

这在Main.java中:

package sample;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 300, 275));
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}
这在sample.fxml中:

<?import javafx.geometry.Insets?>
<?import javafx.scene.layout.GridPane?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<GridPane fx:controller="sample.Controller"
          xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">
</GridPane>

运行时,所有内容都会编译,窗口会弹出,但我会收到标题中所述的警告


我以前从未使用过JavaFX,因此我不确定该模块的位置。

从技术上讲,JavaFX只支持作为命名模块加载。如果JavaFX在未命名模块中结束,则会发出警告。换句话说,JavaFX只支持从模块路径加载,不支持从类路径加载。您需要确保将JavaFX解析为模块,这至少可以通过以下三种方式之一实现:

  • 如果您的代码不是模块化的,则将JavaFX放在
    --模块路径
    上,并确保将所需的模块添加到
    --添加模块
    参数中。例如,如果您的应用程序需要
    javafx.controls
    javafx.fxml
    模块,您可能会有如下功能:

    java——模块路径——添加模块javafx.controls、javafx.fxml。。。
    
    javafx.graphics
    javafx.base
    模块是这些其他模块所必需的,因此将被隐式拉入

  • 如果您的代码是模块化的,那么您将有一个
    moduleinfo
    描述符,它需要JavaFX模块的指令。在这里,您只需要将所有模块放在模块路径上,然后作为模块启动应用程序。例如:

    模块应用程序{
    需要javafx.controls;
    需要javafx.fxml;
    //将应用程序子类的包导出到至少javafx.graphics
    将com.example.app导出到javafx.graphics;
    //打开任何FXML控制器类的包,至少打开javafx.FXML
    // ...
    }
    
    java——模块路径——模块app/com.example.app.Main
    
  • 使用包含JavaFX的Java发行版。现在,JavaFX是运行时映像的一部分,将像运行时映像中的任何其他Java模块一样自动作为模块加载(例如,
    Java.base
    )。无论代码是否是模块化的,这都是正确的。虽然如果您的代码不是模块化的,那么您可能仍然需要
    ——添加模块

    注意:在部署应用程序时,您可以在
    jlink
    /
    jpackage
    中使用此思想

  • 如果您正在使用IDE和/或构建工具,并且不知道在哪里设置
    --模块路径
    --添加模块
    参数,请签出。如果您实际上不知道Java中有哪些模块,那么可以给出一个很好的概述


    尽管如此,据我所知,如果您将JavaFX放在类路径而不是模块路径上,那么当前的似乎没有任何问题。除了一个警告:您的主类不能是
    javafx.application.application
    的子类,因此您需要创建一个单独的主类来启动javafx。换句话说,如果你真的想忽略警告,你可以忽略它。但是我建议您将JavaFX放在模块路径上(即使您自己的代码是非模块化的),如果您这样做不会太麻烦的话。

    确切的错误是什么?我实际上是在遵循您为开始提供的第一个链接。我试图添加
    --模块路径“\path\to\javafx-sdk-16.0.1\lib”--将模块javafx.controls、javafx.fxml
    添加到我的VM选项中,但我的代码没有编译,而是显示“启动层java.lang.module.FindException初始化期间出错:找不到模块javafx.controls”虽然我的外部库中有javafx.controls.jr,但不幸的是,我看到其他人出现了这个错误,尽管没有明显的原因。我还没有弄清楚在这种情况下是怎么回事,所以我不确定我能帮你什么,只是建议你仔细检查一下,确保一切都是正确的。老实说,如果您打算开发一个JavaFX应用程序,那么如果您使用一个包含JavaFX的JDK,您的生活将变得更加简单。据我所知,提供这种JDK的两个发行版是Azul的Zulu社区和BellSoft的Liberica。对于这两个版本,您必须选择包含JavaFX的版本。如果您尝试
    java-p--list modules
    是否列出JavaFX模块?不确定我是否正确执行了此操作,但结果如下:>java-p\path\to\JavaFX-sdk-16.0.1\lib--list modules unrecogned option:-p错误:无法创建java虚拟机。错误:发生致命异常。程序将退出什么
    java-version
    输出?请注意,
    -p
    只是
    --模块路径
    的简写。