2017-08-10 27 views
1

早上,为什么我的Swing主线程会死?

我正面临一个奇怪的问题 - Java - Swing。 这是我的主要方法

public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       try { 

        PrincipalWindow windowImportLoadCurve = new PrincipalWindow(); 
        JFrame.setDefaultLookAndFeelDecorated(true); 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
        setModelViewTable(windowImportLoadCurve); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

在Eclipse IDE(氖2.0)内运行它。它创建4个线程

Daemon Thread [AWT-Windows] (Running) 
Thread [DestroyJavaVM] (Running) -> Main 
Thread [AWT-Shutdown] (Running) 
Thread [AWT-EventQueue-0] (Running) 

它运行正常并且工作,JVM刚好在GUI应用程序完成时关闭。所以我生成了一个使用Maven Install与外部依赖关系的jar。

<build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-dependency-plugin</artifactId> 
       <executions> 
        <execution> 
         <id>weblogic-client-unpack</id> 
         <phase>generate-resources</phase> 
         <goals> 
          <goal>unpack</goal> 
         </goals> 
         <configuration> 
          <artifactItems> 
           <artifactItem>        
            <outputDirectory>${project.build.directory}/</outputDirectory> 
           </artifactItem> 
          </artifactItems> 
         </configuration> 
        </execution> 
        <execution> 
         <id>jboss-client-unpack</id> 
         <phase>generate-resources</phase> 
         <goals> 
          <goal>unpack</goal> 
         </goals> 
         <configuration> 
          <artifactItems> 
           <artifactItem> 
            <outputDirectory>${project.build.directory}/</outputDirectory> 
           </artifactItem> 
          </artifactItems> 
         </configuration> 
        </execution> 
       </executions>     
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-assembly-plugin</artifactId> 
       <executions> 
        <execution> 
         <id>ingrid-load-generator-package-assembly</id> 
         <phase>install</phase> 
         <goals> 
          <goal>single</goal> 
         </goals> 
         <configuration> 
          <manifest> 
           <mainClass>main.MainGenerator</mainClass> 
          </manifest> 
          <descriptors> 
           <descriptor>src/main/assembly/assembly-bin.xml</descriptor> 
          </descriptors> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build>  

并开始使用bat运行。同一个应用程序创建相同的4个线程,因此它会打开GUI(使用SwingUtility.invokeLater()线程)并继续运行main。但是,当GUI实际打开时,它会立即关闭而没有任何用户操作。

+0

为什么使用'SwingUtilities.invokeLater()'来执行所有设置代码?如果直接从'main()'执行,会发生什么? – Thomas

+0

@Thomas因为它应该这样做。阅读文档。 –

+0

@Thomas这就是它应该做的:http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html – bowmore

回答

1

我的第一个猜测是错误的。

尝试使用仅显示您所看到的行为的swing组件创建/发布最小代码示例。

这里是为我工作的例子:

public class Test { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      JFrame jf=new JFrame("Hi"); 
      jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
      JF.setSize(500,200); 
      jf.setVisible(true); 
}});}} 

如果这不适合你,这件事情跟你的环境。如果它对你有用,那就用它作为起点,并开始将它转换成更像你的代码,每次更改后运行测试。当你发现破坏它的变化时,你有你的答案。

+0

我已经插入了Thread.sleep(10000L);在主结束时,GUI opne等待10秒钟并关闭。我已经将invokeLater从invokeAnd更改为invokeAndWait,并且没有任何变化。 我怎样才能把一个连接()在一个SwingUtilities线程?或者等待? –

+0

图形用户界面打开,所以可见是启用和sysout是没有必要的。我已经从SwingUitilities更改为一个共同的线程尝试它仍然工作 –

+0

而你没有得到一个打印的堆栈跟踪?有没有可能你的代码在某个地方有一个空的catch语句?或者那个还是system.exit?如果窗口显示您的应用程序不应该退出。 –

相关问题