我有一个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%正常运行。
答案 0 :(得分:2)
通过更改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将生成必要的代码。
运行主类