Давно не писал настольных приложений на Java вообще и с использовании Swing в частности. Однако, возникла необходимость немного по GUIть. В качестве инструмента выбрал IntelliJ IDEA Community edition, 2016.1 версии.

Взялся ваять и, естественно, первое, на что налетел — хотя со времён Borland Java Builder 2006 воды утекло немало, экранные интерфейсы создавать проще не стало, скорее наоборот. А одной из причин выбора IDEA было как раз наличие Swing дизайнера «из коробки», однако как им пользоваться с ходу решительно непонятно — форма генерится, класс создаётся, создаются переменные контролов из дизайнера… но и только: при создании нашего класса форма на экране не появляется

Пошарил интернет, информации приблизительно ноль. Народ говорит, мол, «создавай и — вперёд!». Хм…

По результатам небольших мытарств на эту тему решил опубликовать инструкцию, так как мне с учётом былого опыта было искать намного легче, чем новичку, который вообще в первый раз ваяет форму на Swing.

Создание Swing GUI форм средствами JetBrains IntelliJ IDEA 2016.1



Во-первых, для понимания процесса лучше начать с того. что зайти в меню IDEA «File -> Settings» — там «Editor -> GUI Designer» и установить флажок Generate GUI Into: в Java source code. (это немного поможет пониманию процесса на первом этапе — потом можно будет убрать обратно).

image

Далее открываем дерево исходного кода своего проекта и кликаем правой кнопкой мыши на любую папку или файл исходного кода java и выбираем «New -> Dialog» — вводим имя класса для формы.

image

В итоге нам действительно сгенерили класс-наследник JDialog (который можно создать и использовать) и форма к нему.
Запускаем наш проект на выполнение и… о ужасчудо! при компиляции IDEA добавляет в конец нашего файла некоторый дополнительный код.

    {
// GUI initializer generated by IntelliJ IDEA GUI Designer
// >>> IMPORTANT!! <<<
// DO NOT EDIT OR ADD ANY CODE HERE!
        $$$setupUI$$$();
    }

    /**
     * Method generated by IntelliJ IDEA GUI Designer
     * >>> IMPORTANT!! <<<
     * DO NOT edit this method OR call it in your code!
     *
     * @noinspection ALL
     */
    private void $$$setupUI$$$() {
        contentPane = new JPanel();
        contentPane.setLayout(new com.intellij.uiDesigner.core.GridLayoutManager(2, 1, new Insets(10, 10, 10, 10), -1, -1));
    ....................
    }

    /**
     * @noinspection ALL
     */
    public JComponent $$$getRootComponent$$$() {
        return contentPane;
    }

Несложно догадаться, что вся наша Swing-овая форма конфигурируется в автогенерируемом методе $$$setupUI$$$.

Вспомните настройку, которую мы установили в самом начале — «GUI Into: -> Java source code». Если её не ставить, то этот метод просто будет появляться напрямую в _class_ файле, минуя java-файл (декомпилируйте его, если сомневаетесь — я это сделал). Соответственно, можете вернуть настройку «GUI Into:» к первоначальному виду, чтобы этот код (который всё равно редактировать настоятельно не рекомендуют) не мозолил глаза.

Теперь, когда мы поняли, как оно работает, перейдём к созданию прочих форм — необязательно диалогов.

Опять правой кнопкой мыши кликаем на папку или файл исходного кода, выбираем «New -> GUI Form» — вводим имя класса для формы.

Генерится класс и форма к нему. Накидываем на форму несколько контролов. В GUI дизайнере смотрим имя корневого элемента (обычно panel1, если IDEA не задала имя, а такое бывает, задайте принудительно — я для наглядности назвал rootPanel).

image

Переходим к исходному коду нашего класса.

Итак:
1. Добавляем для нашего класса наследование «extends JFrame»;
2. Добавляем конструктор класса со строками:

    setContentPane(panel1);
    setVisible(true);

Итоговый код класса
public class GUIFrame extends JFrame{
    private JButton button1;
    private JPanel rootPanel;

    public GUIFrame() {
        setContentPane(rootPanel);
        setVisible(true);

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
    public static void main(String[] args) {
        new GUIFrame();
    }
}


Всё. Форма готова к употреблению. Остальное смотрите в многочисленных инструкциях по Swing.

P.S. Как вариант, можно не наследовать наш класс от JFrame, а создать конструктор вида:

    JFrame frame = new JFrame();
    frame.setContentPane(panel1);
    frame.setVisible(true);

Такой вариант тоже работает — возможно, кому-то пригодится.
Поделиться с друзьями
-->

Комментарии (23)


  1. Swartex
    19.07.2016 18:04

    Скрины то не подгрузились)


    1. si001
      19.07.2016 18:13

      поправил


  1. Ogoyukin
    19.07.2016 18:04

    Не видно изображений


    1. si001
      19.07.2016 18:05

      поправил


      1. Ogoyukin
        19.07.2016 18:05

        Все ок)


  1. Kolyuchkin
    20.07.2016 00:20

    И это «подробная инструкция»? Да-а-а…


    1. si001
      20.07.2016 00:57
      +1

      а в чём проблема? Статья именно о том, как преодолеть проблему того, что «оно не работает» — эта проблема была у меня и ещё у нескольких людей, которых я знаю, потому и статью написал. Остальное — изучайте как работает swing.


      1. Kolyuchkin
        21.07.2016 11:01
        +1

        Вот как раз изучив как работает Swing (по книге Портянкина, например) и попробовав «набрасывать» GUI в Idea-евских или NetBeans-овских редакторах графического интерфейса, я пришел к выводу, что легче все делать «ручками» — Swing это позволяет делать достаточно легко в коде.


        1. si001
          21.07.2016 12:26

          Бывают разные задачи — и трудоёмкость точного навешивание всяких визуальных «красивостей» через GUI-дизайнер заметно ниже (но это личное). И одноразовую формочку сгенерить проще, если это не самая простая по структуре формочка. Но это, понятно, тоже личное мнение, каждый решает для себя.
          Собственно принцип, реализоанный в IDEA мне тоже не нравится. Borland JBuilber 2006 решал эту проблему гораздо изящнее — они генерили _только_ Java-код, который можно было ручками править и даже правленный ручками код обратно прекрасно показывал визард, который опять можно было редактировать хоть в GUI, хоть руками. Почему теперь такие технологии не используются, а используется отдельный XML я не понимаю ((


  1. XemyL
    20.07.2016 00:46
    +1

    целая статья о «New»->«File»?


    1. si001
      20.07.2016 00:55
      -1

      А Вы пробовали этим «New»->«File» воспользоваться?
      Форма в коде не создаётся, если выбран не диалог а GUI Form. Я пока разобрался, что в случае с диалогом оно всё-таки работает, пару раз забрасывал такой «визард» (т.к. логично предполагал что это одно и то же, а диалог мне был не нужен). А в «New -> GUI Form» она именно делает непонятно что. Просто класс и в нём 2 переменных (причём рутовую панель вообще любит туда не включать, т.е. от дизайнера я получаю пустой класс и в нем JButton и всё, хотя в дизайнере я что-то там вроде нарисовал). Об этом и статья — помогает разобраться новичку (из названия статьи и первых абзацев это можно понять), что всё-таки не надо пугаться этого и работать таки можно.


  1. vandermonde
    20.07.2016 10:21

    Стыдно признаться, но я для создания формы в конструкторе пользуюсь NetBeans, а потом копирую исходный код в Idea и дальше его доделываю(переделываю большие блоки однообразного текста в циклы). В NetBeans более гуманитарный конструктор, например в нем не нужно вставлять ручками Spacer-ы, там просто кнопку(таблицу, панельку и тд) куда-то ставишь она со всех сторон подпирается Spacer-ами(вроде бы так).
    В статье надеялся увидеть описание аналогичного функционала в Idea, т.к. может быть я его просто не нашел.


    1. Borz
      20.07.2016 10:40

      Создаю GUI Form в IDEA с GridLayoutManager. Бросаю кнопку на форму — она подпирается Spacer. Причём, в зависимости куда я "прижал" кнопку — или горизонтальным или вертикальным Spacer. ЧЯДНТ?


      1. vandermonde
        20.07.2016 11:24

        дело наверное в том что вы не пользовались конструктором NetBeans. В нем выбор места кнопки не ограничивается прижатостью к сторонам окна, т.е. можно сделать кнопку которая будет стоять посреди окна в заданном месте прямо из конструктора, что удобно когда набрасываешь интерфейс. Как такое сделать с помощью конструктора Idea я не нашел.


        1. Borz
          20.07.2016 13:50

          я пользовался дизайнеров NetBeans, но давно. Да, есть некоторое неудобство в том, что приходится добавлять вручную ещё один Spacer.
          Вопрос — а вы на YouTrack не думали оставить заявку с типом "Usability Problem"?


          1. vandermonde
            20.07.2016 14:09

            увы, ввиду пользования бесплатной версией моя совесть не разрешает мне требовать от них большего чем они уже сделали.


            1. Borz
              20.07.2016 14:12
              +1

              это не требование, а предложение по улучшению продукта


  1. TOBBOT
    20.07.2016 15:00
    -1

    Сгенерированный код режет глаза обилием посторонних символов.

    >>> IMPORTANT!!! <<<
    $$$setupUI$$$()
    $$$getRootComponent$$$()


    1. si001
      20.07.2016 18:30
      +1

      Так выключите же обратно: «File -> Settings» — там «Editor -> GUI Designer» в значение «Binary class files» — тогда этот код будет попадать только в .class — в java мешать не будет тогда.


      1. TOBBOT
        20.07.2016 23:24

        Дело же не в вижу / не вижу, а в том как выглядит сгенерированный код.


  1. jetixon
    21.07.2016 09:34

    У меня ничего не получилось… Выполнял всё как написано. Вот что получилось: yadi.sk/d/BYNDJZIAtUv5L


    1. si001
      21.07.2016 09:43

      И в чём проблема? С Вашими данными — я глянул — всё в порядке, если не считать имени класса с маленькой буквы (не критично, но это может свидетельствовать о том, что собственно изучением Java Вы серьёзно ещё не занялись.) Мой совет — не начинайте с GUI-шных приложений, почитайте толковую книгу с примерами (или сетевые мануалы), наработайте хоть минимальную базу на простых консольных примерах.
      А с Вашими данными вроде всё в порядке — на имя файла клик правой кнопкой — в меню выбирайте Run или Debug и всё. Или летит ошибка выполнения? Тогда приводите трейс.


  1. Steamus
    24.07.2016 16:53

    Справедливости ради нужно указать, что Swing уже несколько лет как не развивается. Он лишь поддерживается. На смену Swing давно пришла библиотека JavaFX (JavaFX 8). Там и сконцентрированы все современные подходы для создания визуальной GUI сцены. Это и CSS для стилизации, и FXML для описания форм и байндинга. В качестве визуального редактора используется открытый инструмент Scene Builder. Он передан на разработку в компанию Gluon. Эта же компания развивает инструмент для поддержки создания мобильных приложений для Android и iOS на JavaFX.
    Таким образом, сейчас уже не имеет смысла возиться со Swing, если, конечно, вам не приходится поддерживать некий ранее написанный код.