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.
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 ) );
}
}
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.
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.
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.
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
vous pouvez utiliser le JOptionDialog
JOptionPane.showMessageDialog([parent frame], [message], [title], JOptionPane.MESSAGE_TYPE);
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.
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.
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.