【问题标题】:Netbeans Swing GUI Builder not working with java-module project and MavenNetbeans Swing GUI Builder 不适用于 java-module 项目和 Maven
【发布时间】:2020-04-01 17:00:29
【问题描述】:

我想将 Netbeans 的 Swing GUI 构建器与 Maven 项目和 java 模块一起使用。如果将它们编译为 java 模块的一部分,则 GUI Builder 似乎无法找到已编译的类。它给出了错误“加载组件时出错(...)无法加载组件类(...)”(请参阅​​示例末尾的屏幕截图中的整个错误)

我已使用 Netbeans 11 将其固定为一个最小示例:

  • 文件 > 新建项目 > Java with Maven > Java 应用程序(使用默认建议并单击完成)

  • 在“Source Packages”下的项目树中,右键单击并添加一个新的 JFrame 和一个 JPanel。

  • 编译项目(运行 > 构建项目),以便您可以使用 GUI Builder 中的类

  • 使用 GUI Builder,将 JPanel 的实例添加到 JFrame,方法是在设计模式下打开 JFrame,然后将 JPanel 拖到 JFrame。

  • 通过添加文件 src/main/java/module-info.java:

  • 更新项目以使用 java 模块
module MavenGuiTest {
    requires java.desktop;
    requires java.logging;
}

  • 再次运行“构建项目”。 Netbeans 然后检测到它现在是一个 java 模块项目并显示一个对话框:

  • 点击Yes,pom.xml中会添加如下内容:

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.1</version>
            </plugin>
        </plugins>
    </build>
  • 再次运行“构建项目”。现在项目已编译完毕。

  • 如果 JFrame 在编辑器中打开,请关闭它。

  • 再次打开它,然后切换到“设计”选项卡。
  • 现在,您收到一个错误:

点击Show Exceptions时,可以看到GUI Builder找不到JPanel的编译类:

这是完整的异常文本:

java.lang.ClassNotFoundException: com.mycompany.mavenproject1.NewJPanel
    at org.netbeans.modules.form.project.ProjectClassLoader.findClass(ProjectClassLoader.java:163)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at org.netbeans.modules.form.project.FormClassLoader.findClass(FormClassLoader.java:58)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:398)
    at org.netbeans.modules.form.project.ClassPathUtils.loadClass(ClassPathUtils.java:89)
    at org.netbeans.modules.form.FormUtils.loadClass(FormUtils.java:1552)
    at org.netbeans.modules.form.PersistenceObjectRegistry.loadClass(PersistenceObjectRegistry.java:73)
    at org.netbeans.modules.form.GandalfPersistenceManager.restoreComponent(GandalfPersistenceManager.java:673)
    at org.netbeans.modules.form.GandalfPersistenceManager.loadComponent(GandalfPersistenceManager.java:949)
    at org.netbeans.modules.form.GandalfPersistenceManager.loadForm(GandalfPersistenceManager.java:484)
    at org.netbeans.modules.form.GandalfPersistenceManager.loadForm(GandalfPersistenceManager.java:260)
    at org.netbeans.modules.form.FormEditor$2.run(FormEditor.java:327)
    at org.netbeans.modules.form.FormLAF$2.run(FormLAF.java:268)
    at org.netbeans.modules.openide.util.NbMutexEventProvider$Event.doEventAccess(NbMutexEventProvider.java:115)
    at org.netbeans.modules.openide.util.NbMutexEventProvider$Event.readAccess(NbMutexEventProvider.java:75)
    at org.netbeans.modules.openide.util.LazyMutexImplementation.readAccess(LazyMutexImplementation.java:71)
    at org.openide.util.Mutex.readAccess(Mutex.java:225)
    at org.netbeans.modules.form.FormLAF.executeWithLookAndFeel(FormLAF.java:251)
    at org.netbeans.modules.form.FormEditor.loadFormData(FormEditor.java:324)
    at org.netbeans.modules.nbform.FormEditorSupport.loadOpeningForm(FormEditorSupport.java:436)
    at org.netbeans.modules.nbform.FormDesignerTC.loadForm(FormDesignerTC.java:256)
    at org.netbeans.modules.nbform.FormDesignerTC.access$300(FormDesignerTC.java:64)
    at org.netbeans.modules.nbform.FormDesignerTC$PreLoadTask$1.run(FormDesignerTC.java:245)
    at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
    at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
    at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
    at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:136)
    at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

我不知道如何修复它,也没有找到任何解决方法。

【问题讨论】:

  • 看来您正面临一个已报告并已修复(即将发布的 11.3 版)问题原始 NETBEANS-2963 JIRA NETBEANS-2983 中的清理版本。
  • 你能在这里复制并粘贴完整的异常
  • @SubOptimal 该问题似乎与自定义组件和 Gradle 有关。我也遇到了标准组件的问题,我使用的是 Maven,而不是 gradle。你确定它是相关的吗?
  • @Kalana 当然,我已经在问题中粘贴了整个异常。
  • @foolo 我相信它是一样的,基于异常的来源org.netbeans.modules.form.project.ProjectClassLoader.findClass(ProjectClassLoader.java:163)

标签: java swing maven netbeans java-module


【解决方案1】:

这只是一个警告而不是错误。即使发生这种情况,您也可以运行此项目。此警告显示这些事情何时发生。

  1. 当您将一个版本切换到另一个版本时。
  2. 您的项目中有未使用或损坏的库。尝试删除此类库。
  3. 您曾经有一个自定义 GUI 组件,但您修改了该类,新的 IDE 不再识别它。只需按下 允许编辑 按钮并执行 clean and build(扫帚和锤子图标)。构建完成后,关闭netbeans 并重新打开它。

【讨论】:

  • 感谢您的提问。该项目构建得很好。问题是 GUI Builder 不起作用,因为它找不到已编译的类。所以基本上问题是“我如何将 Netbeans GUI Builder 与 Maven 和 java-modules 项目一起使用”。我已在问题中添加了详细信息,以及单击“显示异常”时显示的内容。
  • 我提供的最小示例是从头开始创建的,因此它与“我的项目中损坏的库”或“自定义 GUI 组件”没有任何关系。单击“允许编辑”并不能解决问题,因为这只会删除与无法找到的组件关联的所有代码。
  • 请阅读 -> stackoverflow.com/a/10569417/11383441。这能回答你的问题吗
猜你喜欢
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多