创建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毫秒来说,这是一个显着的差异。
另外创建一个AWT Window(或者可能是Frame)而不是JFrame会快很多,因为后者必须引入大量额外的类文件。
虽然java.awt.Frame速度更快,但它仍然超过了一秒的延迟时间。 :( – 2009-02-03 20:36:27
是的,不幸的是它并不是真的很快,如果你在一个程序中拥有所有的东西,那么在执行真正的动作之前创建一个框架,然后在完成时简单地显示它,但总体上它不会更快,但它 – Bombe 2009-02-03 21:16:35
真实的动作发生在一瞬间,所以很不幸我不会得到那种幻想...... – 2009-02-03 21:31:54
我会用JOptionPane来显示消息。这里有一个简单的例子:
import javax.swing.*;
public class OptionDemo {
public static void main(String[] args) throws Exception {
JOptionPane.showMessageDialog(null, "Hello World");
}
}
恐怕我不能解释你正在经历的延迟。在我的系统上,您的代码片段在500毫秒内运行。
这似乎与我尝试的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 ));
}
}
你需要用java来显示消息框吗?如果该框来自应用程序外部,则可能需要使用其他内容来生成对话框。
要创建一个本机窗口应用程序,只显示来自命令行字符串的消息框,最多只需要几个小时。大多数通用脚本语言都应该有办法做到这一点。这里是从通过JavaScript的一些家伙通过命令行的例子:
http://www.snee.com/bobdc.blog/2009/01/displaying-a-message-box-from.html
由于您希望在加速这个了,因为大部分的开销似乎是JVM启动开销,看看Nailgun其目的是通过始终保持JVM在后台运行来解决缓慢的JVM启动问题。就你而言,经过一次运行后,Swing库也将最终被缓存(并且希望在多次运行JIT之后),从而进一步降低开销。
但是,这种方法会导致由于后台JVM导致内存使用量增加,并且还会导致其他问题,因为确定何时关闭它可能并不简单。
我不想显示静态图像,而是一段动态文本。换句话说,我想将stdout重定向到一个GUI消息框。 如果我确实使用System.out。println它很快就回来了,但显然不是正确的格式。 – 2009-02-03 20:25:20