21

GUIデザイナーの助けを借りて作成されたプロジェクトがあります。これがメインフォームのコードです。

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

それは正常に動作します。Jarファイルは問題なく生成されます。ここでは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>

しかし、jarファイルを実行しようとすると、間違いがあります。

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

directLineOkButton リスナーを作成する行に誤りがあることがわかります。ここで言ったようにリスナーを作成します: http://www.jetbrains.com/idea/training/demos/GUI_Designer/GUI_Designer.html cmd + oを使用してコンストラクターで。フォームの xml のコードは次のとおりです。

<?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>
4

5 に答える 5

1

GUI デザイナーの問題は、Intellij が ant を使用してターゲットの .class ファイルを事後操作するため、使用できる Maven の簡単なプラグインがないことです。私のように、.java を intellij コードで攻撃するのが好きでない場合は、maven ant プラグインを使用できます。

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

ただし、javac2 jar をリソース/antlibs に配置する必要があります。私のプロジェクトでは、これらを使用します。

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

これらのライブラリは ${Intellij.home}/libs 内にあります。

特定の IDE レイアウトを使用する場合、それらに関する他の特定の jar が必要になる可能性があります。何かを見逃した場合、ant プラグインは特定のものになります。

于 2021-01-25T23:25:43.497 に答える