我有一个Gradle项目,我正在尝试创建一个GUI(Swing,使用Intellij);但是,我一直收到编译错误。完全相同的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);
}
}
摇篮
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()FAILED线程“main”中的异常java.awt.IllegalComponentStateException:contentPane不能设置为null。 at javax.swing.JRootPane.setContentPane(JRootPane.java:621)at javax.swing.JFrame.setContentPane(JFrame.java:698)at gui.ApplicationGUI.main(ApplicationGUI.java:11)
在我的设置中,我将GUI Designer设置为Java源代码。
我究竟做错了什么?
干杯
EDIT1
我可以确认上面的代码使用Maven 100%正常工作..
正如评论中所提到的,你的rootPanel永远不会被初始化,因此它是null。 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);
}
}
这似乎是Gradle和Intellij之间的问题。解决方案是迁移到Maven。用于GUI的.form
文件(由Intellij生成)应该在frame.setContentPane(new ApplicationGUI().rootPanel);
行初始化,但这不会发生。使用Maven时没有问题。