簡體   English   中英

創建Java消息對話框的最快方法(swing / awt / other)?

[英]Fastest way to create a Java message dialog (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的標准應用程序,並且不會預見到這個問題。
我目前正在研究的是這兩者的混合 - 它將從運行框(或類似的啟動器)啟動,可能帶有參數,並且只需要有效地響應狀態消息,可以通過按鍵。

后一個是問題集中的地方。

雖然我並不反對將現有的命令行版本與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

由於您有興趣加快速度,並且由於大部分開銷似乎都是JVM啟動開銷,因此請查看Nailgun ,它旨在通過始終在后台運行JVM來解決慢速JVM啟動問題。 在你的情況下,在一次運行之后,Swing庫也將最終被緩存(並且希望在經過JIT之后再運行幾次),進一步減少了開銷。

但是,這種方法會因后台JVM而導致內存使用量增加,並且還會導致其他問題,因為可能無法直接確定何時關閉它。

哦,如果你真的不需要從Java顯示對話框,你可以考慮使用KDialog (或它的GNOME對應物)或類似的東西。

您可以使用JOptionDialog

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

您可能正在尋找的是Java 6中新的SplashScreen功能 而不是必須等待JVM加載(加載任何VM總是有成本),這將預先加載一個屏幕。

您是否嘗試通過NetBeans等分析器運行它? 如果標准庫內部存在瓶頸,那么這是找到它的好方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM