2013-09-27 18 views
9

Mam projekt stworzony przy pomocy projektanta GUI. Oto kod głównego formularza.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; 
} 

Działa dobrze. Plik jar generuje dobrze, tutaj kod 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> 

Ale kiedy próbuję uruchomić plik jar, jest błąd.

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

Pokazuje, że błąd jest na linii, w której tworzony jest detektor directLineOkButton. Tworzę słuchacza tak, jak tutaj: http://www.jetbrains.com/idea/training/demos/GUI_Designer/GUI_Designer.html w konstruktorze przy użyciu cmd + o. Oto kod XML postaci:

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

Odpowiedz

0

W dynamicznym inicjatora (część z {{}}), łączysz się directLineOkButton:

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

jednak, że nie ma pola został już przydzielony, więc otrzymujesz wyjątek NullPointerException.

+1

Tak, ale jest inicjowany za pośrednictwem formularza. Jeśli zainicjuję go w konstruktorze, przycisk nie zadziała. –

15

Musisz podać 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> 

i ewentualnie - jeśli używasz GridLayoutManager lub JGoodies - obejmują również forms_rt jako zależność:

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

Thnxx !!!! dużo – xXxpRoGrAmmErxXx

+2

Zauważ, że ta wtyczka ma obecnie błąd powodujący niepowodzenie kompilacji z błędem typu '[ERROR] Nieudane wykonanie celu org.codehaus.mojo: ideauidesigner-maven-plugin: 1.0-beta-1: javac2 (domyślnie) w projekcie {{project}}: Wykonanie domyślne celu org.codehaus.mojo: ideauidesigner-maven-plugin: 1.0-beta-1: javac2 nie powiodło się: {{pewna liczba}} 'jeśli używasz wyrażeń lambda w twoim źródle . Zobacz https://stackoverflow.com/questions/32135018/lambda-expressions-and-java-1-8-in-ideauidesigner, aby uzyskać szczegółowe informacje. – Sumitsu

1

miałem ten sam problem z budowy mój projekt z Maven . Rozwiązałem mój problem polegający na zmianie wartości opcji "Generuj GUI na:" z "Plików klas binarnych" -> "Kod źródłowy Java" w ustawieniach (w Project | Settings | Editor | GUI Designer).

+0

To przyzwoite obejście, dopóki ktoś nie naprawi wtyczki. Zmień konfigurację "Generuj GUI" na @code_eater, a następnie ręcznie zbuduj projekt z IntelliJ za każdym razem, gdy zmienisz formularz GUI, aby zregenerować źródło Java. Sprawdź wygenerowane źródło w formancie źródłowym (opcjonalnie, jeśli używasz kontroli źródła), aby każdy współpracujący z nim projekt mógł pominąć krok ręczny. Następnie niech Maven będzie działał jak zwykle w drzewie źródłowym (teraz zawiera kod wygenerowany przez IntelliJ). Jedyny haczyk polega na tym, że możesz dodać "com.intellij: forms_rt: 7.0.3" jako podstawową zależność. – Sumitsu

Powiązane problemy