由于 Gradle 无法编译 Intellij(Swing)GUI

Lia*_*m G 3 java user-interface swing intellij-idea gradle

我有一个 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

摇篮

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'
}
Run Code Online (Sandbox Code Playgroud)

错误

任务 :ApplicationGUI.main() FAILED 线程“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:

我可以确认上面的代码在 Maven 上 100% 正常工作..

小智 14

通过更改 Intellij 设置解决:

我检查过:

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

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


}
Run Code Online (Sandbox Code Playgroud)


nul*_*ter -1

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

frame.setContentPane(new ApplicationGUI().rootPanel);
Run Code Online (Sandbox Code Playgroud)

公共无效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);
    }
}
Run Code Online (Sandbox Code Playgroud)