La manière la plus rapide de créer un dialogue de message Java (swing/awt/other)?

je crée une application Java qui va faire un peu de traitement puis doit afficher un message pour donner la rétroaction de l'utilisateur.

cependant, il semble être incroyablement lent - plus de deux secondes pour revenir.

j'ai réduit la source au coupable apparent, et voici le code utilisé:

package SwingPlay;

import javax.swing.JFrame;

public class Dialog
{

    public static void main( String[] args )
    {
        JFrame frame = new JFrame( "DialogDemo" );
    }

}

j'exécute ceci depuis la ligne de commande avec:

java -classpath . SwingPlay.Dialog

comme vous pouvez le voir - je suis ne rien faire d'autre que de créer un JFrame, sans même l'afficher.

dans le cas où il est pertinent, voici mon java -version sortie:

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)

et c'est (actuellement) courir contre Win XP SP2.


alors, première question: Pourquoi est-ce si lent?

plus important encore, je veux juste qu'un message simple (GUI, pas cmdline) soit affiché sans délai - quelqu'un peut-il fournir un code pour le faire?


mise à jour:

un peu de fond pourrait être utile:

Je crée une application qui aura de nombreuses "têtes" (c'est-à-dire différentes interfaces utilisateur utilisant toutes les mêmes classes de base pour faire les parties complexes).

J'ai actuellement un chef de ligne de commande pure qui fonctionne très bien - répond tout de suite.

j'aurai aussi un application standard avec une interface graphique point & click régulière, et ne prévoyez pas de problèmes avec ce bit.

ce sur quoi je travaille actuellement est un hybride de ces deux - il sera lancé à partir d'un Run box (ou lanceur similaire), éventuellement avec des arguments, et n'a besoin de répondre, effectivement, un message de statut, qui peut être rejeté avec une touche presse.

cette dernière est celle où la question est focalisée.

bien que je ne sois pas opposé pour utiliser ma version de ligne de commande existante avec des scripts shell (bien que ne pensait pas que ce serait nécessaire!), les réponses existantes semblent suggérer que les choses ne vont pas aussi vite pour moi que pour les autres - un exemple prend 1460ms pour moi, contre 70ms - une différence significative.

12
demandé sur Peter Boughton 2009-02-03 23:10:18

10 réponses

La raison du retard parce que Java est un langage interprété et cela prend du temps à démarrer une nouvelle JVM ( l'interprète )

la création du cadre prend en fait moins de quelques ms ( environ 70 ms dans ma machine ).

si cela doit être utilisé dans une application Java, vous n'avez pas besoin de vous en inquiéter. Il sera presque instantané ( vous devez utiliser JDialog ou JOptionPane pour cela )

si cela ne va pas être utilisé à l'intérieur d'une application Java, et 2 secondes de trop ( et je pense que c'est trop de ), vous devriez envisager un autre outil pour le travail.

Voici comment je mesure le temps dans votre code:

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   ) );
    }

}
11
répondu OscarRyz 2009-02-03 21:03:25

j'utiliserais un JOptionPane pour afficher le message. Voici un exemple simple:

import javax.swing.*;

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

j'ai bien peur de ne pas pouvoir expliquer le retard que vous subissez. Sur mon système, votre code fonctionne en 500 millisecondes.

4
répondu Jason Day 2009-02-03 20:36:54

Java est le mauvais outil pour cela. La mise en place de la JVM implique que beaucoup de choses se passent en arrière-plan avant que la première ligne de code Java puisse être exécutée, et il n'y a vraiment aucun moyen de s'y soustraire.

3
répondu Michael Borgwardt 2009-02-03 20:47:50

en outre, il serait beaucoup plus rapide de créer une AWT Window (ou peut-être un Frame ) au lieu d'un JFrame parce que ce dernier doit tirer dans un gazillion de fichiers de classe supplémentaires.

2
répondu Bombe 2009-02-03 20:24:06

avez-vous besoin d'utiliser java pour afficher la boîte de message? Si la boîte vient de l'extérieur de votre application, alors vous pourriez vouloir utiliser quelque chose d'autre pour générer une boîte de dialogue.

pour faire une application windows native qui montre juste une boîte de message d'une corde de ligne de commande ne prendrait que quelques heures au plus. La plupart des langages de script doit avoir les moyens de le faire aussi. voici un exemple d'un gars par javascript via la ligne de commande:

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

2
répondu John Gardner 2009-02-03 23:57:25

Oh, et si vous n'avez pas vraiment besoin de montrer le dialogue de Java, vous pouvez regarder en utilisant KDialog (ou C'est équivalent GNOME) ou quelque chose de similaire.

1
répondu Bombe 2009-02-03 20:26:21

vous pouvez utiliser le JOptionDialog

JOptionPane.showMessageDialog([parent frame], [message], [title], JOptionPane.MESSAGE_TYPE);
1
répondu ShawnD 2009-02-03 20:37:14

comme vous êtes intéressé à accélérer ce processus, et que la plupart des frais généraux semblent être des frais généraux de démarrage de JVM, consultez Nailgun qui vise à aborder le démarrage lent de JVM en gardant une JVM en cours d'exécution dans l'arrière-plan tout le temps. Dans votre cas, après une exécution, la bibliothèque Swing aussi finira par être mise en cache (et avec un peu de chance après quelques autres éditions), ce qui réduira encore plus la surcharge.

cependant cette approche conduira à une mémoire accrue utilisation en raison de l'arrière-plan JVM et aussi causer d'autres problèmes, car il peut ne pas être simple de déterminer le moment de l'arrêter.

1
répondu Sudarshan S 2013-06-28 21:21:42

ce que vous cherchez probablement, C'est la nouvelle fonctionnalité SplashScreen en Java 6 . Au lieu d'attendre que la JVM se charge (il y a toujours un coût pour charger n'importe quelle VM), cela chargera un écran à l'avance.

0
répondu Stephane Grenier 2009-02-03 20:12:53

avez-vous essayé de l'exécuter à travers un profileur comme NetBeans ? S'il y a un goulot d'étranglement à l'intérieur de la bibliothèque standard, c'est une bonne façon de le trouver.

0
répondu Michael Myers 2009-02-03 21:49:18