9

J'ai un projet créé avec l'aide du concepteur d'interface graphique. Voici le code de la forme principale.IntelliJ idée concepteur de gui + 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; 
} 

Cela fonctionne très bien. fichier Jar génère bien, ici code de 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> 

Mais quand je tente d'exécuter le fichier jar il y a une erreur.

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

Il montre que l'erreur est à la ligne où le listener directLineOkButton est créé. Je crée l'écouteur comme dit ici: http://www.jetbrains.com/idea/training/demos/GUI_Designer/GUI_Designer.html dans le constructeur en utilisant cmd + o. Voici le code XML de la forme:

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

Répondre

0

Dans votre initialiseur dynamique (la partie avec le {{}}), vous accédez directLineOkButton:

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

Cependant, ce domaine n'a pas été assigné encore, de sorte que vous obtenez une exception NullPointerException.

+1

Oui, mais il est initialisé via le formulaire. Si je l'initialise dans le constructeur, le bouton ne fonctionnera pas. –

15

Vous devez inclure 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> 

et éventuellement - si vous utilisez GridLayoutManager ou JGoodies - comprennent également forms_rt comme la dépendance:

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

Thnxx !!!! beaucoup – xXxpRoGrAmmErxXx

+2

Notez que ce plugin a actuellement un bug qui provoque l'échec de la construction avec une erreur comme '[ERREUR] Échec de l'exécution de l'objectif org.codehaus.mojo: ideauidesigner-maven-plugin: 1.0-beta-1: javac2 (par défaut) sur le projet {{projet}}: Exécution par défaut de l'objectif org.codehaus.mojo: ideauidesigner-maven-plugin: 1.0-beta-1: javac2 a échoué: {{un certain nombre}} 'si vous utilisez des expressions lambda dans votre source . Voir https://stackoverflow.com/questions/32135018/lambda-expressions-and-java-1-8-in-ideauidesigner pour plus de détails. – Sumitsu

1

J'ai eu le même problème avec la construction de mon projet avec Maven . Ce qui a résolu mon problème était de changer la valeur de "Générer GUI en:" à partir de "Fichiers de classe binaire" -> "Code source Java" dans les paramètres (dans Projet | Paramètres | Éditeur | GUI Designer).

+0

Ceci est une solution de contournement décent jusqu'à ce que quelqu'un corrige le plugin. Effectuez la modification de la configuration "Générer l'interface utilisateur graphique" que @code_eater indique, puis construisez le projet manuellement à partir d'IntelliJ chaque fois que vous modifiez le formulaire d'interface graphique pour régénérer la source Java correspondante. Vérifiez la source générée dans le contrôle de source (éventuellement, si vous utilisez le contrôle de source), de sorte que toute personne collaborant au projet puisse ignorer l'étape manuelle. Ensuite, laissez Maven s'exécuter comme d'habitude sur l'arborescence des sources (incluant maintenant le code généré par IntelliJ). Le seul problème est que vous devrez ajouter 'com.intellij: forms_rt: 7.0.3' en tant que dépendance primaire. – Sumitsu