2016-12-29 7 views
0

Аналогичный вопрос к этому вопросу задан here примерно год назад. Однако я нахожу, что в конкретном вопросе есть некоторые недостающие детали и моменты, и у него нет надлежащего ответа. Поэтому я снова поднимаю то же самое.Приложение GUI в IntelliJ IDEA с использованием Maven: Throws NullPointerException после встраивания в банку

Я создал проект Maven в IntelliJ IDEA и добавил в него графический интерфейс. По умолчанию IDEA создает отдельный XML-файл для структуры формы. Шахта выглядит следующим образом.

<?xml version="1.0" encoding="UTF-8"?> 
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="TestUI"> 
    <grid id="27dc6" binding="panel1" default-binding="true" layout-manager="GridLayoutManager" row-count="1" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1"> 
    <margin top="0" left="0" bottom="0" right="0"/> 
    <constraints> 
     <xy x="20" y="20" width="500" height="400"/> 
    </constraints> 
    <properties/> 
    <border type="none"/> 
    <children> 
     <component id="e40aa" class="javax.swing.JTextField" binding="txtTest"> 
     <constraints> 
      <grid row="0" column="0" 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> 
     </constraints> 
     <properties/> 
     </component> 
    </children> 
    </grid> 
</form> 

У этого есть класс, связанный с ним, который выглядит следующим образом.

import javax.swing.*; 

public class TestUI { 
    private JTextField txtTest; 
    private JPanel panel1; 

    public TestUI() { 
     String str = txtTest.getText(); 
     JOptionPane.showMessageDialog(null, str); 
     createAndShowGui(); 

     txtTest.addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       JOptionPane.showMessageDialog(null, "Clicked"); 
      } 
     }); 
    } 

    private void createAndShowGui(){ 
     JFrame frame = new JFrame("test"); 
     frame.setContentPane(panel1); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     TestUI obj = new TestUI(); 
    } 
} 

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>com.company.test</groupId> 
    <artifactId>UITestWithIJ</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.6.0</version> 
       <configuration> 
        <source>1.8</source> 
        <target>1.8</target> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-assembly-plugin</artifactId> 
       <version>2.6</version> 
       <configuration> 
        <descriptorRefs> 
         <descriptorRef>jar-with-dependencies</descriptorRef> 
        </descriptorRefs> 
        <archive> 
         <manifest> 
          <mainClass>TestUI</mainClass> 
         </manifest> 
        </archive> 
       </configuration> 
       <executions> 
        <execution> 
         <id>make-assembly</id> 
         <phase>package</phase> 
         <goals> 
          <goal>single</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

Когда это выполняется в IDEA, оно работает безупречно. Поэтому я построил его в толстую банку через Maven, используя плагин сборки. Тогда проблемы начали выпрыгивать. Когда jar, созданный Maven, выполняется, он выдает исключение NullPointerException, которое выглядит следующим образом.

[email protected]:~/.m2/repository/com/company/test/UITestWithIJ/1.0-SNAPSHOT$ java -jar UITestWithIJ-1.0-SNAPSHOT-jar-with-dependencies.jar 
Exception in thread "main" java.lang.NullPointerException 
    at TestUI.<init>(TestUI.java:13) 
    at TestUI.main(TestUI.java:34) 

глубже я копал, я обнаружил, что причина этого заключается в строку # 13, что, который, имеющий идентификатор txtTest в нем. Этот идентификатор ни в коем случае не инициализируется. Следовательно, оно принимает значение по умолчанию null. Поэтому я понял, что проблема на самом деле связана с IDEA, и мне просто нужно преобразовать файл .form, сгенерированный IDEA, в какой-то формат, который только JVM мог прочитать.

После исследования я смог найти решение кандидата here. Согласно инструкциям, я изменил свой POM.xml следующим образом.

  • Добавлена ​​следующая зависимость

    <dependency> 
        <groupId>com.intellij</groupId> 
        <artifactId>forms_rt</artifactId> 
        <version>7.0.3</version> 
    </dependency> 
    
  • Добавлен следующий плагин

    <plugin> 
        <groupId>org.codehaus.mojo</groupId> 
        <artifactId>ideauidesigner-maven-plugin</artifactId> 
        <executions> 
         <execution> 
          <goals> 
           <goal>javac2</goal> 
          </goals> 
         </execution> 
        </executions> 
    
        <configuration> 
         <fork>true</fork> 
         <debug>true</debug> 
         <failOnError>true</failOnError> 
        </configuration> 
    </plugin> 
    

Это решило проблему. Однако в TestUI.java вы видите, что добавлен прослушиватель событий. Это может быть заменено выражением лямбда от Java 8 четвертого. После того, как я сделал эту замену, Maven не смог собрать банку, выбросив следующие ошибки.

[email protected]:~/IdeaProjects/UITestWithIJ$ mvn clean install 
[INFO] Scanning for projects... 
[WARNING] 
[WARNING] Some problems were encountered while building the effective model for com.company.test:UITestWithIJ:jar:1.0-SNAPSHOT 
[WARNING] 'build.plugins.plugin.version' for org.codehaus.mojo:ideauidesigner-maven-plugin is missing. @ line 53, column 21 
[WARNING] 
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build. 
[WARNING] 
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects. 
[WARNING] 
[INFO]                   
[INFO] ------------------------------------------------------------------------ 
[INFO] Building UITestWithIJ 1.0-SNAPSHOT 
[INFO] ------------------------------------------------------------------------ 
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ UITestWithIJ --- 
[INFO] Deleting /home/user/IdeaProjects/UITestWithIJ/target 
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ UITestWithIJ --- 
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent! 
[INFO] Copying 0 resource 
[INFO] 
[INFO] --- maven-compiler-plugin:3.6.0:compile (default-compile) @ UITestWithIJ --- 
[INFO] Changes detected - recompiling the module! 
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent! 
[INFO] Compiling 1 source file to /home/user/IdeaProjects/UITestWithIJ/target/classes 
[INFO] 
[INFO] --- ideauidesigner-maven-plugin:1.0-beta-1:javac2 (default) @ UITestWithIJ --- 
[INFO] Executing IDEA UI Designer task... 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD FAILURE 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 1.227 s 
[INFO] Finished at: 2016-12-29T11:11:43+05:30 
[INFO] Final Memory: 17M/205M 
[INFO] ------------------------------------------------------------------------ 
[ERROR] Failed to execute goal org.codehaus.mojo:ideauidesigner-maven-plugin:1.0-beta-1:javac2 (default) on project UITestWithIJ: Execution default of goal org.codehaus.mojo:ideauidesigner-maven-plugin:1.0-beta-1:javac2 failed: 52264 -> [Help 1] 
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. 
[ERROR] Re-run Maven using the -X switch to enable full debug logging. 
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles: 
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/PluginExecutionException 

Я отставной то же самое с -X коммутатором и обнаружил, что на самом деле не удается вот Maven цель javac2 для плагина ideauidesigner-maven-plugin и единственно возможной причиной для этого является лямбда-выражение. Метод в плагине бросает ArrayIndexOutOfBoundsException. Я проверил это и зависимость forms_rt в репозитории Maven, и я заметил, что они в последний раз обновляются в 2009 и 2010 годах. Возможно, плагин неспособен обрабатывать выражение лямбда.

Ниже приведены мои вопросы.

  • Я что-то не так?
  • Есть ли исправление для этого?
  • Есть ли жизнеспособная альтернатива для этого?
+0

Вы нашли решение? – Nikola

ответ

0

Первая возможность:

frame.setContentPane(panel1); 

Здесь pane1 не инициализирован и является недействительным.

Вторая возможность:

String str = txtTest.getText(); 
JOptionPane.showMessageDialog(null, str); 

Вы передаете null в showMessageDialog(), где он ожидает родительский Component.

+0

Нет. Ни одна из ваших возможностей не является причиной. Я предлагаю вам воспроизвести это самостоятельно и попробовать. –