创建Java消息对话框的最快方法(swing / awt / other)?

我正在创建一个Java应用程序,它将进行一些处理,然后需要显示一条消息以向用户提供反馈。

然而,它看起来非常缓慢 – 需要两秒钟才能返回。

我将源代码删除到明显的罪魁祸首,这里是使用的代码:

package SwingPlay; import javax.swing.JFrame; public class Dialog { public static void main( String[] args ) { JFrame frame = new JFrame( "DialogDemo" ); } } 

我正在从命令行执行此操作:

 java -classpath . SwingPlay.Dialog 

正如你所看到的 – 我什么也没做,只是创建了一个JFrame,甚至没有显示它。

如果它是相关的,这是我的java -version输出:

 java version "1.6.0_11" Java(TM) SE Runtime Environment (build 1.6.0_11-b03) Java HotSpot(TM) Client VM (build 11.0-b16, mixed mode, sharing) 

这是(目前)针对Win XP SP2运行的。


所以,第一个问题:为什么这么慢?

更重要的是,我只想要一个简单的消息(GUI,而不是cmdline)毫不拖延地显示 – 任何人都可以提供一些代码来执行此操作吗?


更新:

一些背景可能会有所帮助:
我正在创建一个具有许多“头”的应用程序(即不同的用户界面都使用相同的核心类来完成复杂的部分)。
我目前有一个纯粹的命令行头,工作正常 – 直接响应。
我还将有一个带有常规点击式GUI的标准应用程序,并且不会预见到这个问题。
我目前正在研究的是这两者的混合 – 它将从Run框(或类似的启动器)启动,可能带有参数,并且只需要有效地响应状态消息,可以用按键。

后一个是问题集中的地方。

虽然我并不反对将现有的命令行版本与shell脚本一起使用(虽然不认为这是必要的!),现有的答案似乎表明事情对我来说并不像对别人那样快 – 一个例如,对我来说需要1460毫秒,而70毫秒 – 这是一个显着的差异。

延迟它的原因是因为Java是一种解释型语言,启动一个新的JVM(解释器)需要时间

实际上创建帧只需不到几毫秒(我的机器约70毫秒)。

如果要在Java应用程序中使用它,则无需担心它。 它几乎是瞬间的(你应该使用JDialog或JOptionPane)

如果这不是在Java应用程序中使用,并且2秒太多(我认为它太多)你应该考虑另一个工具。

以下是我在代码中测量时间的方法:

 import javax.swing.JFrame; public class Dialog { public static void main( String[] args ) { long start = System.currentTimeMillis(); JFrame frame = new JFrame( "DialogDemo" ); System.out.println( "Took: " + ( System.currentTimeMillis() - start ) ); } } 

我会使用JOptionPane来显示消息。 这是一个简单的例子:

 import javax.swing.*; public class OptionDemo { public static void main(String[] args) throws Exception { JOptionPane.showMessageDialog(null, "Hello World"); } } 

我恐怕无法解释你遇到的延迟。 在我的系统上,您的代码段在500毫秒内运行。

Java是错误的工具。 设置JVM涉及在第一行Java代码执行之前在后台发生的很多事情,而且实际上没有办法绕过它。

另外,创建一个AWT窗口 (或者一个框架 )而不是JFrame要快得多,因为后者必须引入大量额外的类文件。

你需要使用java来显示消息框吗? 如果该框来自您的应用程序外部,那么您可能希望使用其他内容来生成对话框。

要创建一个仅显示命令行字符串消息框的本机Windows应用程序,最多只需要几个小时。 大多数常见的脚本语言也应该有办法。 这是一些人通过命令行通过javascript的例子:

http://www.snee.com/bobdc.blog/2009/01/displaying-a-message-box-from.html

哦,如果你真的不需要从Java显示对话框,你可以考虑使用KDialog (或它的GNOME对应物)或类似的东西。

您可以使用JOptionDialog

 JOptionPane.showMessageDialog([parent frame], [message], [title], JOptionPane.MESSAGE_TYPE); 

由于您有兴趣加快速度,并且由于大部分开销似乎都是JVM启动开销,因此请查看Nailgun ,它旨在通过始终在后台运行JVM来解决慢速JVM启动问题。 在你的情况下,在一次运行之后,Swing库也将最终被缓存(并且希望在经过几次JITed运行之后),进一步减少了开销。

但是,这种方法会导致由于后台JVM而导致内存使用量增加,并且还会导致其他问题,因为确定何时关闭它可能不是直截了当的。

您可能正在寻找的是Java 6中新的SplashScreenfunction 。 而不是必须等待JVM加载(加载任何VM总是有成本),这将预先加载一个屏幕。

您是否尝试通过NetBeans等分析器运行它? 如果标准库内部存在瓶颈,那么这是找到它的好方法。