sirve - La forma más rápida de crear un diálogo de mensaje Java(swing/awt/other)?
joptionpane.showmessagedialog para que sirve (10)
¿Has intentado ejecutarlo a través de un generador de perfiles como NetBeans ? Si hay un cuello de botella en el interior de la biblioteca estándar, esa es una buena forma de encontrarlo.
Estoy creando una aplicación Java que procesará algo y luego tendrá que mostrar un mensaje para que el usuario reciba sus comentarios.
Sin embargo, parece ser increíblemente lento, tardando más de dos segundos en regresar.
Bajé la fuente al culpable aparente, y aquí está el código utilizado:
package SwingPlay;
import javax.swing.JFrame;
public class Dialog
{
public static void main( String[] args )
{
JFrame frame = new JFrame( "DialogDemo" );
}
}
Estoy ejecutando esto desde la línea de comando con:
java -classpath . SwingPlay.Dialog
Como puede ver, no hago nada más que crear un JFrame, ni siquiera mostrarlo.
En caso de que sea relevante, aquí está mi salida 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)
Y esto es (actualmente) corriendo contra Win XP SP2.
Entonces, primera pregunta: ¿Por qué es tan lento?
Más importante aún, solo quiero que se muestre sin demora un mensaje simple (GUI, no cmdline). ¿Alguien puede proporcionar algún código para hacer esto?
Actualizar:
Un poco de historia puede ser útil:
Estoy creando una aplicación que tendrá muchas ''cabezas'' (es decir, diferentes interfaces de usuario que usan las mismas clases básicas para hacer las partes complejas).
Actualmente tengo una cabeza de línea de comando pura que funciona bien, responde de inmediato.
También tendré una aplicación estándar con una GUI de apuntar y hacer clic con regularidad, y no preveo problemas con este bit.
En lo que estoy trabajando actualmente es en un híbrido de estos dos: se lanzará desde un cuadro Ejecutar (o un iniciador similar), posiblemente con argumentos, y solo necesita responder, efectivamente, con un mensaje de estado, que puede descartarse con un presionar la tecla.
Este último es donde la pregunta está enfocada.
Aunque no me opongo a utilizar mi versión de línea de comandos existente con scripts de shell (¡aunque no pensé que fuera necesario!), Las respuestas existentes parecen sugerir que las cosas no se ejecutan tan rápido para mí como para otros: uno el ejemplo toma 1460ms para mí, frente a 70ms, una diferencia significativa.
¿NECESITA usar java para mostrar el cuadro de mensaje? SI la caja proviene de fuera de su aplicación, entonces quizás quiera usar algo más para generar un diálogo.
Para hacer que una aplicación de Windows nativa que solo muestra un cuadro de mensaje desde una cadena de línea de comando solo tome unas pocas horas como máximo. La mayoría de los lenguajes de scripting comunes también deberían tener formas de hacerlo. Aquí hay un ejemplo de un tipo a través de javascript a través de la línea de comando:
http://www.snee.com/bobdc.blog/2009/01/displaying-a-message-box-from.html
Ah, y si realmente no necesitas mostrar el diálogo desde Java, podrías considerar usar KDialog (o su homólogo de GNOME) o algo similar.
El motivo de la demora es porque Java es un lenguaje interpretado y lleva tiempo iniciar una nueva JVM (el intérprete)
En realidad, crear el cuadro requiere menos de unos pocos ms (unos 70 ms en mi máquina).
Si esto va a ser utilizado dentro de una aplicación Java, no necesita preocuparse por ello. Será casi instantáneo (debe usar JDialog o JOptionPane para esto)
Si esto NO se va a utilizar dentro de una aplicación Java, y 2 segundos es demasiado (y creo que es demasiado), debería considerar otra herramienta para el trabajo.
Así es como mido el tiempo en su código:
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 es la herramienta incorrecta para esto. La configuración de JVM implica muchas cosas sucediendo en segundo plano antes de que se pueda ejecutar la primera línea de código Java, y realmente no hay forma de evitarlo.
Lo que probablemente esté buscando es la nueva funcionalidad de SplashScreen en Java 6 . En lugar de tener que esperar a que se cargue la JVM (siempre hay un costo para cargar cualquier máquina virtual), esto cargará una pantalla de antemano.
Podría usar el JOptionDialog
JOptionPane.showMessageDialog([parent frame], [message], [title], JOptionPane.MESSAGE_TYPE);
También sería mucho más rápido crear una Ventana AWT (o tal vez un Marco ) en lugar de un Marco J debido a que este último tiene que atrapar un tropel de archivos de clase adicionales.
Yo usaría un JOptionPane para mostrar el mensaje. Aquí hay un ejemplo simple:
import javax.swing.*;
public class OptionDemo {
public static void main(String[] args) throws Exception {
JOptionPane.showMessageDialog(null, "Hello World");
}
}
Me temo que no puedo explicar el retraso que estás experimentando. En mi sistema, su fragmento de código se ejecuta en 500 milisegundos.
Dado que está interesado en acelerar esto, y dado que la mayor parte de la sobrecarga parece ser la sobrecarga de inicio de JVM, consulte Nailgun que tiene como objetivo abordar el arranque lento de JVM al mantener una JVM ejecutándose en segundo plano todo el tiempo. En su caso, después de una ejecución, la biblioteca Swing también terminará en caché (y con suerte después de algunas ejecuciones JIT también), reduciendo aún más la sobrecarga.
Sin embargo, este enfoque dará lugar a un mayor uso de memoria debido a la JVM de fondo y también causará otros problemas, ya que puede no ser sencillo determinar cuándo apagarlo.