IntelliJ idea gui designer + maven
Asked Answered
G

4

21

I have a project created with help of GUI designer. Here is code of main form.

public class MainForm {
    MainForm() {
        directLineOkButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
               //some action
                }
            }
        });
        crossLineOkButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
               //some action
        });
        clearButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
            //some action
        });
        cancelButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
            //some action
        });
        saveButton.addActionListener(new ActionListener() {
           public void actionPerformed(ActionEvent arg0) {
          //some action
        });
    }

    public JPanel getMainPanel() {
        return mainPanel;
    }

    private void createUIComponents() {
        drawingPanel = new DrawingPanel();
    }

    private JPanel mainPanel;
    private JComboBox directDirectionCombobox;
    private JButton directLineOkButton;
    private JButton crossLineOkButton;
    private JComboBox crossLineComboBox;
    private JTextField crossLineSizeValue;
    private JButton clearButton;
    private JLabel directLineLabel;
    private JPanel directLinePanel;
    private JLabel crossLineLabel;
    private JPanel crossLinePanel;
    private JPanel okClearButtonPanel;
    private JTextField directLineSizeValue;
    private JButton saveButton;
    private JPanel drawingPanel;
    private JButton cancelButton;
}

It works fine. Jar file generates fine, here code of pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>DOC</groupId>
    <artifactId>DOC</artifactId>
    <version>1.0</version>
    <dependencies>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.9</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>Main</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>

            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>Main</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

But when I try to run jar file there is a mistake.

Exception in thread "main" java.lang.NullPointerException
at MainForm.<init>(MainForm.java:14)
at Main.main(Main.java:13)

It show that mistake is at the line where directLineOkButton listener is created. I create listener like said here: http://www.jetbrains.com/idea/training/demos/GUI_Designer/GUI_Designer.html in constructor using cmd+o. Here is code of xml of form:

<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="MainForm">
  <grid id="27dc6" binding="mainPanel" layout-manager="FormLayout">
    <rowspec value="center:23px:noGrow"/>
    <rowspec value="top:3dlu:noGrow"/>
    <rowspec value="center:47px:noGrow"/>
    <rowspec value="top:3dlu:noGrow"/>
    <rowspec value="center:max(d;4px):noGrow"/>
    <rowspec value="top:3dlu:noGrow"/>
    <rowspec value="center:max(d;4px):noGrow"/>
    <rowspec value="top:7dlu:noGrow"/>
    <rowspec value="center:25px:noGrow"/>
    <rowspec value="top:174dlu:noGrow"/>
    <rowspec value="center:max(d;4px):noGrow"/>
    <colspec value="fill:d:noGrow"/>
    <colspec value="left:4dlu:noGrow"/>
    <colspec value="fill:452px:noGrow"/>
    <constraints>
      <xy x="20" y="20" width="797" height="453"/>
    </constraints>
    <properties/>
    <border type="none"/>
    <children>
      <component id="3b663" class="javax.swing.JLabel" binding="directLineLabel">
        <constraints>
          <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
          <forms/>
        </constraints>
        <properties>
          <text value="Direct Line"/>
        </properties>
      </component>
      <grid id="499e0" binding="directLinePanel" layout-manager="FormLayout">
        <rowspec value="center:d:grow"/>
        <colspec value="fill:98px:noGrow"/>
        <colspec value="left:4dlu:noGrow"/>
        <colspec value="fill:80px:grow"/>
        <colspec value="left:4dlu:noGrow"/>
        <colspec value="fill:max(d;4px):noGrow"/>
        <colspec value="left:4dlu:noGrow"/>
        <colspec value="fill:max(d;4px):noGrow"/>
        <constraints>
          <grid row="1" column="0" row-span="2" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
          <forms/>
        </constraints>
        <properties/>
        <border type="none"/>
        <children>
          <component id="c383d" class="javax.swing.JComboBox" binding="directDirectionCombobox">
            <constraints>
              <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="2" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
              <forms/>
            </constraints>
            <properties>
              <enabled value="true"/>
              <model>
                <item value="Вверх"/>
                <item value="Вниз"/>
                <item value="Вправо"/>
                <item value="Влево"/>
              </model>
            </properties>
          </component>
          <component id="17aa1" class="javax.swing.JTextField" binding="directLineSizeValue">
            <constraints>
              <grid row="0" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false">
                <preferred-size width="150" height="-1"/>
              </grid>
              <forms defaultalign-horz="false"/>
            </constraints>
            <properties/>
          </component>
          <component id="44fc7" class="javax.swing.JButton" binding="directLineOkButton">
            <constraints>
              <grid row="0" column="4" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
              <forms/>
            </constraints>
            <properties>
              <text value="OK"/>
            </properties>
          </component>
        </children>
      </grid>
      <component id="5a571" class="javax.swing.JLabel" binding="crossLineLabel">
        <constraints>
          <grid row="4" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
          <forms/>
        </constraints>
        <properties>
          <text value="Cross Line"/>
        </properties>
      </component>
      <grid id="77f1a" binding="crossLinePanel" layout-manager="FormLayout">
        <rowspec value="center:d:grow"/>
        <colspec value="fill:98px:noGrow"/>
        <colspec value="left:4dlu:noGrow"/>
        <colspec value="fill:80px:grow"/>
        <colspec value="left:4dlu:noGrow"/>
        <colspec value="fill:max(d;4px):noGrow"/>
        <colspec value="left:4dlu:noGrow"/>
        <colspec value="fill:max(d;4px):noGrow"/>
        <constraints>
          <grid row="6" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
          <forms/>
        </constraints>
        <properties/>
        <border type="none"/>
        <children>
          <component id="32368" class="javax.swing.JComboBox" binding="crossLineComboBox">
            <constraints>
              <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="2" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
              <forms/>
            </constraints>
            <properties>
              <model>
                <item value="Вверх-вправо"/>
                <item value="Вверх-влево"/>
                <item value="Вниз-вправо"/>
                <item value="Вниз-влево"/>
              </model>
            </properties>
          </component>
          <component id="dbf23" class="javax.swing.JTextField" binding="crossLineSizeValue">
            <constraints>
              <grid row="0" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false">
                <preferred-size width="150" height="-1"/>
              </grid>
              <forms defaultalign-horz="false"/>
            </constraints>
            <properties/>
          </component>
          <component id="c5c8a" class="javax.swing.JButton" binding="crossLineOkButton">
            <constraints>
              <grid row="0" column="4" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
              <forms/>
            </constraints>
            <properties>
              <text value="OK"/>
            </properties>
          </component>
        </children>
      </grid>
      <grid id="53bbc" binding="okClearButtonPanel" layout-manager="FormLayout">
        <rowspec value="center:d:noGrow"/>
        <colspec value="fill:d:noGrow"/>
        <colspec value="left:4dlu:noGrow"/>
        <colspec value="fill:max(d;4px):noGrow"/>
        <colspec value="left:4dlu:noGrow"/>
        <colspec value="fill:max(d;4px):noGrow"/>
        <constraints>
          <grid row="8" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
          <forms/>
        </constraints>
        <properties>
          <enabled value="false"/>
        </properties>
        <border type="none"/>
        <children>
          <component id="41ba7" class="javax.swing.JButton" binding="saveButton">
            <constraints>
              <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
              <forms/>
            </constraints>
            <properties>
              <text value="Сохранить"/>
            </properties>
          </component>
          <component id="a6bf6" class="javax.swing.JButton" binding="clearButton">
            <constraints>
              <grid row="0" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
              <forms/>
            </constraints>
            <properties>
              <text value="Очистить"/>
            </properties>
          </component>
          <component id="40f1c" class="javax.swing.JButton" binding="cancelButton">
            <constraints>
              <grid row="0" column="4" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
              <forms/>
            </constraints>
            <properties>
              <text value="Отменить"/>
            </properties>
          </component>
        </children>
      </grid>
      <grid id="2e94e" binding="drawingPanel" custom-create="true" layout-manager="FormLayout">
        <rowspec value="center:d:grow"/>
        <colspec value="fill:d:grow"/>
        <constraints>
          <grid row="0" column="2" row-span="11" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
          <forms/>
        </constraints>
        <properties>
          <background color="-1"/>
        </properties>
        <border type="none"/>
        <children/>
      </grid>
    </children>
  </grid>
</form>
Gombosi answered 27/9, 2013 at 11:10 Comment(0)
V
29

You must include ideauidesigner-maven-plugin:

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>ideauidesigner-maven-plugin</artifactId>
            <version>1.0-beta-1</version>
            <executions>
                <execution>
                    <goals>
                        <goal>javac2</goal>
                    </goals>
                </execution>
            </executions>

            <configuration>
                <fork>true</fork>
                <debug>true</debug>
                <failOnError>true</failOnError>
            </configuration>
        </plugin>
    </plugins>
</build>

and optionally - if you use GridLayoutManager or JGoodies - include also forms_rt as dependency:

    <dependency>
        <groupId>com.intellij</groupId>
        <artifactId>forms_rt</artifactId>
        <version>7.0.3</version>
    </dependency>
Vinegary answered 16/9, 2014 at 19:44 Comment(1)
Note that this plugin currently has a bug which causes the build to fail with an error like [ERROR] Failed to execute goal org.codehaus.mojo:ideauidesigner-maven-plugin:1.0-beta-1:javac2 (default) on project {{project}}: Execution default of goal org.codehaus.mojo:ideauidesigner-maven-plugin:1.0-beta-1:javac2 failed: {{some-number}} if you use lambda expressions in your source. See #32135518 for details.Oops
I
10

I had the same problem with building my project with maven. What solved my problem was to change the value for "Generate GUI into:" from "Binary class files" --> "Java source code" in the settings (found in Project|Settings|Editor|GUI Designer).

Ichnology answered 2/3, 2017 at 11:48 Comment(1)
This is a decent workaround until someone fixes the plugin. Make the "Generate GUI" config change that @Ichnology indicates, then build the project manually from IntelliJ any time that you change the GUI form to regenerate the Java source for it. Check the generated source into source control (optionally, if you're using source control), so that anyone collaborating on the project can skip the manual step. Then let Maven run as usual on the source tree (now including IntelliJ's generated code). The only catch is that you may have to add com.intellij:forms_rt:7.0.3 as a primary dependency.Oops
G
2

I've found decision by myself.

http://glxn.net/2010/08/17/making-a-swing-project-using-intellij-idea-and-gui-builder-with-maven-including-executable-jar
You need special plugin to make maven projects with intelliji idea gui designer.

Gombosi answered 28/9, 2013 at 13:7 Comment(2)
The link is brokenNeed
Please fix this link.Friend
I
1

The problem with the GUI designer is that it does not have a maven straightforward plugin that you can use, because Intellij uses ant to post-manipulate the target .class files. If you, like me, does not enjoy bombarding your .java with intellij code, you could use the maven ant plugin:

         <plugin>
            <artifactId>maven-antrun-plugin</artifactId>
            <version>1.7</version>
            <dependencies>
                <dependency>
                    <groupId>com.sun</groupId>
                    <artifactId>tools</artifactId>
                    <version>1.7.0</version>
                    <scope>system</scope>
                    <systemPath>${java.home}/../lib/tools.jar</systemPath>
                </dependency>
            </dependencies>
            <executions>
                <execution>
                    <phase>compile</phase>
                    <configuration>
                        <tasks>
                            <path id="j2cp">
                                <fileset dir="${project.basedir}/src/main/resources/antlibs" includes="*.jar"/>
                            </path>
                            <path id="j2sp">
                                <pathelement location="${project.basedir}/src/main/java"/>
                            </path>

                            <taskdef name="javac2" classpathref="j2cp" classname="com.intellij.ant.Javac2"/>
                            <javac2 destdir="${project.basedir}/target/classes"> 
                                <src refid="j2sp"/>
                            </javac2>
                        </tasks>
                    </configuration>
                    <goals>
                        <goal>run</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

But you need the javac2 jars to be put in resources/antlibs, in my project I use these:

  • asm-5.0.3.jar
  • asm-all-7.0.1.jar
  • javac2.jar
  • jdom.jar

You can find these libraries inside your ${Intellij.home}/libs

If you use specific IDE layouts, maybe you will need other specific jars regarding them, the ant plugin will be specific if you missed out something

Inexhaustible answered 25/1, 2021 at 23:25 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.