9

Ho un progetto creato con l'aiuto del progettista GUI. Ecco il codice del modulo principale.IntelliJ idea gui designer + maven

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

Funziona correttamente. file Jar genera bene, qui il codice di 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> 

Ma quando si tenta di eseguire file jar c'è un errore.

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

Mostra che l'errore è nella riga in cui viene creato il listener directLineOkButton. Creo listener come detto qui: http://www.jetbrains.com/idea/training/demos/GUI_Designer/GUI_Designer.html nel costruttore che utilizza cmd + o. Ecco il codice di xml della forma:

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

risposta

0

Nella inizializzazione dinamica (la parte con il {{}}), si accede directLineOkButton:

directLineOkButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       //some action 
       } 
      } 
     }); 

Tuttavia, quel campo non ha è stato assegnato ancora, quindi ottieni una NullPointerException.

+1

Sì, ma è inizializzato tramite modulo. Se lo inizializzo in costruttore, il pulsante non funzionerà. –

15

È necessario includere 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> 

ed eventualmente - se si utilizza GridLayoutManager o JGoodies - includono anche forms_rt come dipendenza:

<dependency> 
     <groupId>com.intellij</groupId> 
     <artifactId>forms_rt</artifactId> 
     <version>7.0.3</version> 
    </dependency> 
+0

Thnxx !!!! molto – xXxpRoGrAmmErxXx

+2

Nota che questo plugin ha attualmente un bug che causa il fallimento della build con un errore come '[ERROR] Impossibile eseguire l'obiettivo org.codehaus.mojo: ideauidesigner-maven-plugin: 1.0-beta-1: javac2 (default) sul progetto {{project}}: l'esecuzione predefinita dell'obiettivo org.codehaus.mojo: ideauidesigner-maven-plugin: 1.0-beta-1: javac2 non riuscito: {{some-number}} 'se si utilizzano espressioni lambda nella propria origine . Vedi https://stackoverflow.com/questions/32135018/lambda-expressions-and-java-1-8-in-ideauidesigner per i dettagli. – Sumitsu

1

ho avuto lo stesso problema con costruire il mio progetto con Maven . Ciò che ha risolto il mio problema è stato quello di modificare il valore di "Genera GUI in:" da "Binary class files" -> "Java source code" nelle impostazioni (che si trova in Project | Settings | Editor | GUI Designer).

+0

Questa soluzione è accettabile finché qualcuno non risolve il plug-in. Fai in modo che la configurazione "Genera GUI" cambi che @code_eater indichi, quindi costruisci il progetto manualmente da IntelliJ ogni volta che cambi il modulo della GUI per rigenerare l'origine Java per esso. Controlla la sorgente generata nel controllo del codice sorgente (facoltativamente, se stai utilizzando il controllo del codice sorgente), in modo che chiunque collabori al progetto possa saltare il passaggio manuale. Quindi lascia che Maven funzioni come al solito nell'albero dei sorgenti (ora includendo il codice generato da IntelliJ). L'unico problema è che potresti dover aggiungere 'com.intellij: forms_rt: 7.0.3' come dipendenza primaria. – Sumitsu