我正面临一个奇怪的问题 - 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实际打开时,它会立即关闭而没有任何用户操作。
为什么使用'SwingUtilities.invokeLater()'来执行所有设置代码?如果直接从'main()'执行,会发生什么? – Thomas
@Thomas因为它应该这样做。阅读文档。 –
@Thomas这就是它应该做的:http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html – bowmore