2009-02-03 34 views
11

我正在創建一個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毫秒來說,這是一個顯着的差異。

回答

0

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

+0

我不想顯示靜態圖像,而是一段動態文本。換句話說,我想將stdout重定向到一個GUI消息框。 如果我確實使用System.out。println它很快就回來了,但顯然不是正確的格式。 – 2009-02-03 20:25:20

2

另外創建一個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

1

哦,如果你真的不需要顯示來自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

4

我會用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

1

您可以使用JOptionDialog

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

Java是這個錯誤的工具。設置JVM涉及很多在執行第一行Java代碼之前在後臺發生的事情,而且真的沒有辦法解決它。

10

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

} 
0

您是否嘗試過通過像NetBeans探查運行呢?如果標準庫內部存在瓶頸,那麼這是找到它的好方法。

2

你需要用java來顯示消息框嗎?如果該框來自應用程序外部,則可能需要使用其他內容來生成對話框。

要創建一個本機窗口應用程序,只顯示來自命令行字符串的消息框,最多隻需要幾個小時。大多數通用腳本語言都應該有辦法做到這一點。這裏是從通過JavaScript的一些傢伙通過命令行的例子:

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

1

由於您希望在加速這個了,因爲大部分的開銷似乎是JVM啓動開銷,看看Nailgun其目的是通過始終保持JVM在後臺運行來解決緩慢的JVM啓動問題。就你而言,經過一次運行後,Swing庫也將最終被緩存(並且希望在多次運行JIT之後),從而進一步降低開銷。

但是,這種方法會導致由於後臺JVM導致內存使用量增加,並且還會導致其他問題,因爲確定何時關閉它可能並不簡單。