You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Java FX 19集成JFoenix日期选择器时Maven报错求解决方案

解决JavaFX 19集成JFoenix日期选择器的模块访问报错

报错原因

这个错误是因为JFoenix的JFXGenericPickerBehavior类依赖了JavaFX的内部非公开API——com.sun.javafx.scene.control.behavior.ComboBoxBaseBehavior。JavaFX 9+启用模块化系统(JPMS)后,默认不会将这类内部包导出给未命名模块(即没有声明module-info.java的项目),导致访问被拒绝。


解决方案

1. 未使用module-info.java(未命名模块)

在运行程序时添加VM参数,强制让javafx.controls模块将内部包导出给所有未命名模块:

--add-exports javafx.controls/com.sun.javafx.scene.control.behavior=ALL-UNNAMED
--add-exports javafx.controls/com.sun.javafx.scene.control.inputmap=ALL-UNNAMED

如果是通过Maven的exec-maven-plugin运行项目,需要在pom.xml的插件配置中加入这些参数:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>3.1.0</version>
    <executions>
        <execution>
            <goals>
                <goal>exec</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <executable>java</executable>
        <arguments>
            <argument>--module-path</argument>
            <argument>${project.build.directory}/modules</argument>
            <!-- 添加导出权限参数 -->
            <argument>--add-exports</argument>
            <argument>javafx.controls/com.sun.javafx.scene.control.behavior=ALL-UNNAMED</argument>
            <argument>--add-exports</argument>
            <argument>javafx.controls/com.sun.javafx.scene.control.inputmap=ALL-UNNAMED</argument>
            <argument>-cp</argument>
            <argument>${project.build.dependencyClasspath}</argument>
            <argument>你的主类全限定名</argument>
        </arguments>
    </configuration>
</plugin>

2. 使用module-info.java(模块化项目)

在module-info.java中声明对JavaFX内部包的访问权限,并确保依赖JFoenix模块:

module your.module.name {
    requires javafx.controls;
    requires jfoenix; // 声明依赖JFoenix
    
    // 允许JFoenix访问JavaFX的内部API
    opens com.sun.javafx.scene.control.behavior to jfoenix;
    opens com.sun.javafx.scene.control.inputmap to jfoenix;
    
    // 其他必要的模块声明
    requires transitive javafx.graphics;
    exports your.package.name; // 导出你的主类所在包
}

注意:如果使用的JFoenix版本没有自带module-info.java(非模块化构建),这种方法可能无效,建议改用第一种方案。

3. 替代方案:更换/升级依赖

  • 尝试使用适配JavaFX 19的JFoenix最新版本,部分新版本已修复模块化兼容问题。
  • 如果找不到合适的JFoenix版本,可替换为不依赖内部API的日期选择器库,比如ControlsFX的DatePicker组件。

内容的提问来源于stack exchange,提问作者Dilshan Dekumpitiya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 18:05:22