【问题标题】:Intellij (Swing) GUI not compiling because of Gradle由于 Gradle,Intellij (Swing) GUI 无法编译
【发布时间】:2019-09-14 14:01:51
【问题描述】:

我有一个 Gradle 项目,我正在尝试创建一个 GUI(Swing,使用 Intellij);但是,我一直收到编译错误。完全相同的 GUI 代码可以在标准 Java 项目上运行并且编译良好。

图形界面

package gui;
import javax.swing.*;

public class ApplicationGUI {
    private JPanel rootPanel;
    private JLabel testLabel;

    public static void main(String[] args) {
        JFrame frame = new JFrame("ApplicationGUI");
        frame.setContentPane(new ApplicationGUI().rootPanel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}

分级

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'

    compile 'ca.uhn.hapi.fhir:hapi-fhir-base:3.7.0'
    compile 'ca.uhn.hapi.fhir:hapi-fhir-structures-dstu3:3.7.0'
    compile 'ca.uhn.hapi.fhir:hapi-fhir-client:3.7.0'
}

错误

任务:ApplicationGUI.main() 失败 线程“main”java.awt.IllegalComponentStateException 中的异常:contentPane 不能设置为 null。 在 javax.swing.JRootPane.setContentPane(JRootPane.java:621) 在 javax.swing.JFrame.setContentPane(JFrame.java:698) 在 gui.ApplicationGUI.main(ApplicationGUI.java:11)

在我的设置中,我将 GUI 设计器设置为 Java 源代码。

我做错了什么?

干杯

编辑1:

我可以确认上面的代码可以 100% 使用 Maven..

【问题讨论】:

  • 这个和gradle无关,rootPanel就是null,不能设置一个null的值作为内容窗格。
  • 好吧,如果没有 Gradle,我不需要在我的其他项目中设置任何东西吗?当我初始化它时,我没有任何 GUI 组件?例如,它们在表单上不存在/不可见。
  • 请找到解决方案there!

标签: java swing user-interface gradle intellij-idea


【解决方案1】:

通过更改 intellij 设置解决:

我已经检查过:

  • 自动导入...
  • 使用 -set -intellij 构建和运行
  • 使用 -set -intellij 运行测试
  • Gradle JVM - 设置 - 使用项目 JDK

我的代码是:

package com.mygdx.game.desktop;

import javax.swing.*;
import com.badlogic.gdx.backends.lwjgl.LwjglAWTCanvas;
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
import com.mygdx.game.MyGdxGame;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class MainForm {
    private JPanel mainpanel_1;
    private JPanel visualizationPanel_1;
    private JButton button1;

    private static MyGdxGame visualization;
    private JFrame mainFrame;

    public MainForm(JFrame frame) {
        mainFrame = frame;
    }

    public static void main(String[] args) throws ClassNotFoundException, UnsupportedLookAndFeelException, InstantiationException, IllegalAccessException {

        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("My First Swing Example");
            frame.setResizable(false);
            frame.setMinimumSize(new Dimension(1300, 850));
            frame.setSize(1300, 850);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            MainForm mf = new MainForm(frame);
            if(mf.mainpanel_1 != null) {
                frame.setContentPane(mf.mainpanel_1);
            }

            visualization = new MyGdxGame();

            LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
            config.width = 1200;
            config.height = 800;
            config.forceExit = false;
            config.resizable = false;
            LwjglAWTCanvas lwjglCanvas = new LwjglAWTCanvas(visualization, config);
            mf.visualizationPanel_1.add(lwjglCanvas.getCanvas());

            frame.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent windowEvent) {
                    lwjglCanvas.stop();
                    System.exit(0);
                }


            });

            frame.pack();

            // Setting the frame visibility to true
            frame.setVisible(true);
        });
    }


}

【讨论】:

    【解决方案2】:

    仅将执行从 Gradle 更改为 Intellij 并不能解决主要问题,因为在构建 Gradle jar 时它将继续无法工作。

    我执行了以下操作来解决问题并继续使用 Gradle。

    进入Editor -> GUI Designer -> Generate GUI into,选择Java Source

    将 Intellij 表单依赖项添加到您的 gradle 项目

    implementation 'com.intellij:forms_rt:7.0.3'
    

    转到编辑器的 GUI 并进行一些更改(例如创建新组件或更改标签),这样 Intellij 将生成必要的代码。

    运行主类

    【讨论】:

      【解决方案3】:

      这似乎是 Gradle 和 Intellij 之间的问题。一个解决方案是迁移到 Maven。 GUI 的 .form 文件(由 Intellij 生成)应在 frame.setContentPane(new ApplicationGUI().rootPanel); 行初始化,但这不会发生。使用 Maven 时没有问题。

      【讨论】:

        【解决方案4】:

        如 cmets 中所述,您的 rootPanel 从未初始化,因此它为空。 默认情况下,JFrame 已经有一个 jpanel contentPane,因此您实际上并不需要以下行,除非您打算替换它:

        frame.setContentPane(new ApplicationGUI().rootPanel);
        

        public void setContentPane(Container contentPane)

        设置 contentPane 属性。此方法由 构造函数。 Swing 的绘画架构需要一个不透明的 包含层次结构中的 JComponent。这通常由 内容窗格。如果您更换内容窗格,建议 你用不透明的 JComponent 替换它。

        下面是一些创建框架并向其添加标签的示例代码。

        public class ApplicationGUI{
            public static void main(String[] args) {
                JLabel aLabel = new JLabel("some text");
                JFrame frame = new JFrame("ApplicationGUI");
                frame.getContentPane().add(aLabel);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setSize(300,300);
                frame.setVisible(true);
            }
        }
        

        【讨论】:

        • 好的,这样就可以显示 GUI,但看不到任何内容?
        • 另外,rootPanel 怎么是空的? new 关键字不会解决这个问题吗?
        • 没有任何内容可见:因为您没有向 JFrame 添加任何内容。 new 关键字不能解决这个问题:不,因为它是在您的类 ApplicationGUI 上调用的,而不是在其实例变量 rootPanel 上调用的。要初始化它,你可以做private JPanel rootPanel = new JPanel();
        • 好的,那么如何将它们添加到 JFrame 中? frame.add(testLabel) 不起作用,因为它无法识别 testLabel。我也尝试像那样初始化 JPanel,但没有任何改变。
        • 好的,这样可以,但是我有一个ApplicationGUI.form 文件,其中包含我的所有元素。我将如何附加此文件或至少将其所有元素包含在正确的位置?
        猜你喜欢
        • 2016-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-15
        • 2016-10-14
        • 1970-01-01
        • 2014-12-09
        • 1970-01-01
        相关资源
        最近更新 更多