Intellij (Swing) GUI не компилируется из-за Gradle - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть проект Gradle, и я пытаюсь создать графический интерфейс (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);
    }
}

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'
}

Error

Задача: ApplicationGUI.main () FAILED Исключение в потоке "main" java.awt.IllegalComponentStateException: contentPane не может быть установлено в ноль. в javax.swing.JRootPane.setContentPane (JRootPane.java:621) в javax.swing.JFrame.setContentPane (JFrame.java:698) в gui.ApplicationGUI.main (ApplicationGUI.java:11)

В моих настройках у меня установлен GUI Designer на Исходный код Java.

Что я делаю не так?

Приветствия

EDIT1:

Я могу подтвердить, что приведенный выше код прекрасно работает с Maven ..

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Кажется, это проблема между Gradle и Intellij.Решение состоит в том, чтобы перейти на Maven.Файл .form (созданный Intellij) для графического интерфейса должен быть инициализирован в строке frame.setContentPane(new ApplicationGUI().rootPanel);, но этого не происходит.При использовании Maven проблем не возникает.

0 голосов
/ 25 апреля 2019

Как уже упоминалось в комментариях, ваша rootPanel никогда не инициализируется, поэтому она пуста.JFrame уже имеет jpanel contentPane уже по умолчанию, поэтому вам не нужна строка ниже, если вы не собираетесь ее заменять:

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

public void setContentPane (Container contentPane)

Устанавливает свойство contentPane. Этот метод вызывается конструктором.Живописная архитектура Swing требует непрозрачного компонента в иерархии содержания.Обычно это обеспечивается областью содержимого.Если вы заменяете панель содержимого, рекомендуется заменить ее непрозрачным 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...