由于Gradle

时间:2019-04-25 07:40:20

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

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

GUI

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);
    }
}

Gradle

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()失败       线程“主”中的异常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源代码。

我在做什么错了?

欢呼

EDIT1:

我可以确认上述代码在Maven中可以100%正常运行。

4 个答案:

答案 0 :(得分:2)

通过更改intellij设置来解决:

我已检查:

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

Screenshot of IntelliJ

我的代码是:

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);
        });
    }


}

答案 1 :(得分:0)

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

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

公共无效setContentPane(容器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);
    }
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

进入Editor -> GUI Designer -> Generate GUI into,选择 Java源代码

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

implementation 'com.intellij:forms_rt:7.0.3'

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

运行主类