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

问题描述:

我正在创建一个Java应用程序,它将执行一些处理,然后显示一条消息以提供用户反馈。创建Java消息对话框的最快方法(swing/awt/other)?

但是,它似乎非常慢 - 需要两秒钟才能返回。

我扯下了源到明显的罪魁祸首,而这里是使用的代码:

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)来显示,没有任何延迟 - 任何人都可以提供一些代码来做到这一点?


更新:

一点背景可能会有所帮助:
我创建这将有许多“头”的应用程序(即不同的用户界面都使用相同的核心类做复杂的部分)。
我目前有一个纯粹的命令行头,它可以正常工作 - 马上响应。
我也将有一个标准的应用程序,点击图形用户界面的常规点&,并没有预见到这一点的问题。
我目前正在处理的是这两者的混合 - 它将从运行框(或类似的启动器)启动,可能带有参数,并且只需要有效地回复状态消息,可以被解散与按键。

后面这个问题是关注焦点的地方。

虽然我不反对使用我的现有命令行版本与shell脚本(虽然不认为这是必要的!),现有的答案似乎表明,事情并没有像我一样快速运行,因为它们是对于其他人 - 一个例子需要1460毫秒,而对于70毫秒来说,这是一个显着的差异。

你可能要找的是new SplashScreen functionality in Java 6。不必等待JVM加载(加载任何VM总是需要花费),而是预先加载屏幕。

+0

我不想显示静态图像,而是一段动态文本。换句话说,我想将stdout重定向到一个GUI消息框。 如果我确实使用System.out。println它很快就回来了,但显然不是正确的格式。 – 2009-02-03 20:25:20

另外创建一个AWT Window(或者可能是Frame)而不是JFrame会快很多,因为后者必须引入大量额外的类文件。

+0

虽然java.awt.Frame速度更快,但它仍然超过了一秒的延迟时间。 :( – 2009-02-03 20:36:27

+0

是的,不幸的是它并不是真的很快,如果你在一个程序中拥有所有的东西,那么在执行真正的动作之前创建一个框架,然后在完成时简单地显示它,但总体上它不会更快,但它 – Bombe 2009-02-03 21:16:35

+0

真实的动作发生在一瞬间,所以很不幸我不会得到那种幻想...... – 2009-02-03 21:31:54

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

+0

应用程序的核心需要是Java,但是如果使用基本接口太慢,那么我可以使用shell脚本来显示程序的响应。 – 2009-02-03 20:33:59

+0

是的,Java中与GUI相关的第一个实例化将总是很慢(er),没有办法防止这种情况发生, JNI或Runtime.exec()) – Bombe 2009-02-03 21:52:08

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

import javax.swing.*; 

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

恐怕我不能解释你正在经历的延迟。在我的系统上,您的代码片段在500毫秒内运行。

+0

这似乎与我尝试的AWT示例大致相同(超过一秒,也许约1.5s),这是一个改进,但仍然令人生厌,如果我可能会达到500毫秒,这可能是可以接受的。 – 2009-02-03 20:43:03

您可以使用JOptionDialog

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

Java是这个错误的工具。设置JVM涉及很多在执行第一行Java代码之前在后台发生的事情,而且真的没有办法解决它。

的原因延迟,因为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 )); 
    } 

} 

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

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

要创建一个本机窗口应用程序,只显示来自命令行字符串的消息框,最多只需要几个小时。大多数通用脚本语言都应该有办法做到这一点。这里是从通过JavaScript的一些家伙通过命令行的例子:

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

由于您希望在加速这个了,因为大部分的开销似乎是JVM启动开销,看看Nailgun其目的是通过始终保持JVM在后台运行来解决缓慢的JVM启动问题。就你而言,经过一次运行后,Swing库也将最终被缓存(并且希望在多次运行JIT之后),从而进一步降低开销。

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