Diseño de aplicaciones de escritorio Java: Introducción a SWT
El prestigio del lenguaje Java obviamente es muy inconsistente con sus logros en aplicaciones de escritorio (programas GUI). Todavía es raro ver programas de escritorio Java muy exitosos, aunque existen software a gran escala como JBuilder. , Netbean y JProbe, pero esto todavía no prueba que los programas GUI de Java sean exitosos. Su apariencia siempre parece fuera de lugar con otro software bajo la misma plataforma del sistema operativo. La demanda de configuración de la máquina también parece ser interminable. sólo puede ser utilizado por aquellos que siempre tienen la versión actual. Tolerado por programadores de PC de alto rendimiento o aceptado por usuarios profesionales a quienes no les importa el dinero ni el tiempo. Para la mayoría de los usuarios de computadoras, AWT o SWING representan interfaces extrañas y velocidades inaceptables. (SWT) Quizás sea el fin de la pesadilla de Java. La mayoría de los programadores de Java finalmente pueden desarrollar programas GUI eficientes. Casi nadie puede decir que su programa está escrito en Java. son multiplataforma.
SWT en sí es solo un conjunto de API de interfaz gráfica de bajo nivel escritas por la organización Eclipse para desarrollar el entorno IDE de Eclipse. Hasta ahora, SWT lo es. Sobresaliente en términos de rendimiento y apariencia. Ha superado a AWT y SWING proporcionados por SUN. En la actualidad, Eclipse IDE ha desarrollado una versión que ya es muy estable. > Uno se refiere a la estabilidad del rendimiento, cuya clave se deriva de SWT. El concepto de diseño de SWT maximiza la API del componente gráfico del sistema operativo, es decir, siempre que el sistema operativo proporcione los componentes gráficos correspondientes, SWT. simplemente usa la tecnología JNI para llamarlos. Solo aquellos componentes que no son proporcionados por el sistema operativo serán simulados por el propio SWT. Se puede ver en la implementación que la estabilidad del rendimiento de SWT depende principalmente de la estabilidad de los gráficos correspondientes del sistema operativo. componentes
Otra estabilidad significa que los nombres y estructuras de los métodos de clase en el paquete API SWT rara vez cambian el programa. Los desarrolladores no tienen que preocuparse de que el código de su programa cambie demasiado debido al rápido desarrollo. progreso de la organización de Eclipse (Eclipse IDE lanza una versión nocturna todos los días. La actualización de una versión de SWT a otra generalmente solo requiere un simple reemplazo del paquete SWT. Eso es todo
El primer programa SWT
Iniciemos un programa SWT (tenga en cuenta que los siguientes ejemplos e instrucciones son principalmente para la plataforma Windows y otros sistemas operativos deben ser similares) En primer lugar, el paquete SWT se encuentra en el archivo de instalación de Eclipse. No proporciona una descarga del paquete SWT por separado. Debe descargar el entorno de desarrollo de Eclipse completo para obtener el paquete SWT que existe como complemento del entorno de desarrollo de Eclipse y se puede encontrar en ${su ruta de instalación de eclipse}\. Los numerosos subdirectorios en la ruta de complementos para buscar el archivo JAR SWT. El archivo JAR encontrado contiene todos los archivos de clase Java de SWT. Debido a que SWT aplica la tecnología JNI, también debe encontrar el archivo de biblioteca de localización JNI correspondiente debido a la versión y el funcionamiento. plataforma Habrá algunas diferencias en los nombres de diferentes archivos de biblioteca localizados. Por ejemplo, SWT WIN DLL es la biblioteca dinámica de Eclipse Build en la plataforma Windows. La extensión de la versión correspondiente del archivo de biblioteca en la plataforma Unix. etc. Tenga en cuenta que Eclipse es un proyecto de código fuente abierto, por lo que también puede encontrar el código fuente de SWT en estos directorios. Creo que esto será útil para el desarrollo. (solo el método principal)
importar un ejemplo;public class OpenShell{public static void main(String [] args) {Display display = new Display()
; Shell shell = new Shell(display); shell open() // Inicia el ciclo de procesamiento de eventos hasta que el usuario cierre la ventana while (!shell isDisposed()) { if (!display readAndDispatch()) display sleep(); } display dispose ();}}
Asegúrese de que el archivo SWT JAR esté incluido en CLASSPATH. Primero use Javac para compilar el programa de ejemplo. Después de compilar sin errores, puede ejecutar la biblioteca java Djava path=$. {la ruta de su archivo de biblioteca local SWT} y un ejemplo de OpenShell. Por ejemplo, la ruta donde se encuentra el archivo DLL SWT WIN es C:\swtlib. El comando que se ejecutará debe ser ruta de la biblioteca java Djava=c:\swtlib. un ejemplo de OpenShell Después de una operación exitosa, el sistema abrirá una ventana vacía
Análisis de la API SWT
Analicemos más a fondo la composición de la API SWT. Todas las clases SWT utilizan eclipse swt. el prefijo del paquete Para simplificar la explicación, usamos * para representar el prefijo eclipse swt, como * widgets El paquete representa el paquete de widgets eclipse swt
Nuestros componentes gráficos más utilizados se incluyen básicamente en. el paquete de widgets *, como la tabla de guiones de etiquetas de texto combinadas de botones, etc. Los dos componentes más importantes son Shell y Composite Shell, que es equivalente al marco de la ventana principal de la aplicación. En el código de ejemplo anterior, el componente Shell se utiliza para abrir. una ventana vacía es equivalente al objeto Panel en SWING y actúa como un contenedor de componentes. Es mejor cuando queremos agregar algunos componentes a una ventana. Use Composite como contenedor para otros componentes y luego vaya al diseño. paquete para encontrar un método de diseño adecuado. SWT también usa SWING o la combinación de Diseño y Datos de diseño en AWT para el diseño de componentes. Se pueden encontrar cuatro tipos en el paquete de diseño y sus correspondientes objetos de estructura de diseño (Datos de diseño). El paquete *custom contiene extensiones para algunos componentes gráficos básicos. Por ejemplo, CLabel es una extensión del componente Label estándar. Puede agregar texto e imágenes al mismo tiempo, y también puede agregar bordes. Componente de texto Proporciona funciones de texto enriquecido, como configurar el color de fondo, el color de primer plano o la fuente de un determinado texto. También se puede encontrar un nuevo método de diseño StackLayout en el *paquete personalizado
par SWT. para operaciones de usuario como eventos de mouse o teclado también usa el modo Observador en AWT y SWING. En el paquete de eventos *, puede encontrar la interfaz de escucha y los objetos de eventos correspondientes para el monitoreo de eventos, como la interfaz de escucha de eventos de mouse comúnmente utilizada MouseListener. MouseMoveListener y MouseTrackListener y su objeto de evento correspondiente MouseEvent
* Las API para fuentes de cursor de imagen o dibujos se pueden encontrar en el paquete de gráficos. Por ejemplo, se pueden llamar diferentes tipos de archivos de imagen en el sistema a través de la clase Imagen. Y la función de dibujo del componente de imagen o visualización se puede implementar a través de la clase GC. Eclipse también ha desarrollado algunas API específicas para diferentes plataformas. Por ejemplo, en la plataforma Windows, el control OLE se puede realizar fácilmente. llamado a través del paquete *ole win. ¡Esto hace posibles los programas Java integrados en programas como el navegador IE o Word Excel!
Programas más complejos
p>
Muestremos un programa que es más complejo que el ejemplo anterior. Este programa tiene un cuadro de texto y un botón. Cuando el usuario hace clic en el botón, el cuadro de texto muestra un mensaje de bienvenida.
Para que el cuadro de texto y los botones tengan un tamaño y diseño relativamente razonables, aquí se utiliza el método de diseño GridLayout. Este diseño es el método de diseño más utilizado y potente en SWT. Casi todos los formatos se pueden lograr a través de GridLayout. El siguiente programa también incluye cómo aplicar recursos del sistema (Color) y cómo liberar recursos del sistema
private void initShell(Shell shell) { //Establecer el objeto de diseño GridLayout para Shell gShellLay = new GridLayout(); setLayout(gShellLay); // Construya un componente compuesto como cuadro de texto y contenedor de botones Panel compuesto = new Composite(shell SWT NONE); // Especifique un objeto de estructura de diseño para el Panel aquí, deje que el Panel ocupe el Shell tanto como sea posible. es decir, el espacio de todas las ventanas de la aplicación GridData gPanelData = new GridData(GridData GRAB_HORIZONTAL| GridData GRAB_VERTICAL|GridData FILL_BOTH); objeto para mostrar GridLayout gPanelLay = new GridLayout(); panel setLayout(gPanelLay);/ /Generar un color de fondo para el Panel final Color bkColor = new Color(Display getCurrent() panel setBackground(bkColor); Texto texto = nuevo Texto(panel SWT MULTI|SWT WRAP); // Para texto El cuadro especifica un objeto de estructura de diseño Aquí, deje que el cuadro de texto ocupe el espacio del Panel tanto como sea posible. GRAB_HORIZONTAL| GridData GRAB_VERTICAL|GridData FILL_BOTH); text setLayoutData(gTextData); //Generar botón Button butt = new Button( panel SWT PUSH);butt setText( Push ); { public void mouseDown(MouseEvent e){ // Muestra información cuando el usuario hace clic en el texto del botón setText( Hello SWT ); // DisposeListener se activará cuando se cierre la ventana principal. del Panel. shell addDisposeListener(new DisposeListener(){ public void widgetDisposed(DisposeEvent e) { bkColor dispose(); } };}
Agregue el método initShell() en este código al primer ejemplo de abriendo una ventana vacía para obtener un método de ejecución de aplicación GUI completo que pueda ejecutarse correctamente.
Para obtener más información, consulte el primer ejemplo
Gestión de recursos del sistema
Al desarrollar un programa en un sistema operativo gráfico, debe llamar a recursos en el sistema, como imágenes y fuentes. , colores, etc. Por lo general, todos estos recursos Los programadores son limitados y deben usarlos con mucho cuidado cuando ya no se utilicen, libérelos lo antes posible, de lo contrario, tarde o temprano, el sistema operativo se quedará sin combustible. tener que reiniciar. Más en serio, hará que el sistema falle. SWT está desarrollado en Java. Una de las grandes ventajas del lenguaje en sí es el mecanismo de recolección de basura de la JVM. como la liberación de variables y el reciclaje de memoria. Entonces, ¿sucede lo mismo con el funcionamiento de los recursos del sistema para SWT? La respuesta es una mala noticia y una buena noticia.
La mala noticia es que SWT no utiliza el mecanismo de recolección de basura de la JVM para abordar el problema de reciclaje de recursos del sistema operativo. Un factor clave es la recolección de basura de la JVM. El mecanismo es incontrolable. En otras palabras, los programadores no pueden saberlo y no pueden permitir que la JVM recicle recursos en un momento determinado. Esto es fatal para el procesamiento de los recursos del sistema. Imagine que su programa quiere ver decenas de miles de imágenes en una declaración de bucle. El método de procesamiento convencional es cargar una imagen cada vez para verla y luego liberar inmediatamente el recurso de imagen y luego cargarla. Para una imagen, para el sistema operativo, el programa solo ocupa los recursos de una imagen a la vez, pero si este proceso se deja completamente en manos de la JVM, es posible que la JVM no libere los recursos de la imagen hasta la declaración del bucle. termina El resultado puede ser que el sistema operativo no funciona antes de que su programa termine de ejecutarse.
Pero las siguientes buenas noticias pueden hacer que estas malas noticias sean irrelevantes. Para SWT, solo necesita comprender dos reglas de oro simples. Úselo con confianza. Recursos del sistema. La razón por la que se llama regla de oro uno es porque solo hay dos. La segunda regla es porque son sorprendentemente simples. La primera regla es quién lo ocupa y quién lo libera. La segunda regla es que cuando se destruye el componente principal. los componentes secundarios también se destruyen al mismo tiempo. La primera regla es una regla sin ningún principio de excepción: siempre que el programa llame al constructor de la clase de recurso del sistema, el programa debería preocuparse por liberar el recurso del sistema en un momento determinado. , como llamar a
Font font = new Font (display Courier SWT NORMAL
p>Entonces debes llamar a font dispose() cuando ya no necesites la fuente
p>font dispose();
Para el segundo principio, si el programa llama a eliminar un determinado método de componente (), todos los componentes secundarios de este componente también se destruirán automáticamente al llamar. el método dispose() Por lo general, la relación entre el componente secundario y el componente principal al que se hace referencia aquí se forma cuando se llama al constructor del componente. Por ejemplo,
Shell shell = new Shell(); Composite parent = new Composite(shell SWT NULL);Composite child = new Composite(parent SWT NULL
El componente principal de parent es el shell y el shell es el programa. La ventana principal no tiene un; componente principal correspondiente. Al mismo tiempo, el componente principal también incluye el componente secundario. Si se llama al método dispose() del shell para aplicar la segunda regla, el método dispose() de los componentes principal e secundario también será llamado automáticamente. SWT API y se destruirán en consecuencia.
Problemas de subprocesos
En cualquier sistema GUI de plataforma operativa, las operaciones de acceso a los componentes o algunas API gráficas deben estar estrictamente sincronizadas y serializadas, como las pulsaciones de teclas. en una interfaz gráfica, los componentes se pueden configurar en un estado disponible (habilitar) o en un estado deshabilitado (deshabilitar). El método de procesamiento normal es que las operaciones de configuración del estado clave del usuario se coloquen en la cola de procesamiento de eventos del sistema GUI (esto significa). que las operaciones de acceso están serializadas) y luego procesarlas en secuencia (esto significa que las operaciones de acceso están sincronizadas). Imagine que el programa quiere configurar el botón en el estado deshabilitado antes de que se ejecute la función de configuración del estado disponible del botón. completado, lo que inevitablemente causará un conflicto. De hecho, esto.
Este tipo de operación desencadenará una excepción en cualquier sistema GUI.
El lenguaje Java en sí proporciona un mecanismo de subprocesos múltiples. Este mecanismo es desfavorable para la programación GUI. No puede garantizar la sincronización y serialización de las operaciones de componentes gráficos. SWT. Esta es una forma simple y directa de adaptarse a los requisitos de subprocesos del sistema GUI local. En SWT, generalmente hay un subproceso único llamado subproceso de usuario. Solo en este subproceso se pueden acceder a operaciones de componentes o a ciertas API de gráficos. Si en Si el programa en el subproceso no usuario llama directamente a estas operaciones de acceso, se generará la excepción SWTExcepiton. Sin embargo, SWT también proporciona dos métodos en la clase *widget Display para acceder indirectamente a los componentes gráficos en el subproceso no usuario. Esto se hace a través de syncExec(Runnable) y asyncExec(Runnable) son dos métodos para implementar, por ejemplo
//En este momento, el programa se está ejecutando en un hilo que no es de usuario y desea agregar un botón. al panel de componentes
Mostrar getCurrent() asyncExec(new Runnable() { public void run() { Button butt = new Button(panel SWT PUSH); butt setText( Push ); }}); /p>
Métodos syncExec() y asyncExec La diferencia entre () es que el primero regresará después de que finalice la ejecución del hilo especificado, mientras que el segundo regresará inmediatamente al hilo actual independientemente de si se ejecuta el hilo especificado.
Extensión SWT JFace
JFace La relación con SWT es como la relación entre MFC de Microsoft y JFace está desarrollado en base a SWT. Su API es más fácil de usar que SWT. sus funciones no son tan directas como SWT. Por ejemplo, el siguiente código usa MessageDialog en JFace para abrir un cuadro de diálogo de advertencia
MessageDialog openWarning(mensaje de advertencia de advertencia principal); Utilice SWT solo para completar las declaraciones funcionales anteriores, y no ocupará menos de una línea.
JFace fue diseñado originalmente para que sea más conveniente usar SWT. Su objetivo principal es escribir. Desarrollar el entorno IDE de Eclipse en lugar de aplicarlo a otras aplicaciones independientes. Por lo tanto, es difícil separar completamente la API JFace de la API principal de Eclipse antes de la versión de Eclipse. Solo importa algunas clases de código principal de Eclipse. o interfaces distintas de JFace, ¿puede obtener un paquete de desarrollo de JFace sin errores de compilación? Sin embargo, la organización Eclipse parece haberse dado cuenta gradualmente del importante papel que desempeña JFace en el desarrollo de aplicaciones independientes. En la versión desarrollada, JFace también ha comenzado a convertirse en un. Paquete de desarrollo completo e independiente como SWT. Sin embargo, este paquete de desarrollo aún está cambiando (la versión Eclipse M utilizada cuando el autor escribió este artículo) El prefijo del paquete de desarrollo JFace comienza con eclipse jface El código fuente del paquete JAR. También es el mismo que el de SWT. SWT también se puede encontrar en ${tu ruta de instalación de eclipse}\ruta de complementos
Para los desarrolladores, una mejor manera de desarrollar un componente gráfico es ir primero a Paquete JFace y búsquelo. ¿Existe un método de implementación más simple? Si no utiliza el paquete SWT para implementarlo usted mismo, JFace proporciona un buen soporte para cuadros de diálogo además de varios tipos de cuadros de diálogo. el MessageDialog usado arriba o el cuadro de diálogo con una barra de título) ) Si desea implementar un cuadro de diálogo personalizado, también es mejor heredar de la clase Dialog en JFace en lugar del * widget Dialog en SWT
Es fácil utilizar las clases del paquete Preferencias en JFace usted mismo. El software crea un cuadro de diálogo de configuración muy profesional.
Para los componentes gráficos como la tabla de árbol, deben estar asociados con los datos mientras se muestran. Por ejemplo, los datos que se muestran en la tabla. El paquete Vista en JFace proporciona un método de programación de vista de modelo para dichos componentes. más separado Es propicio para el desarrollo y el mantenimiento. La función principal proporcionada en JFace es el procesamiento de contenido de texto. Puede encontrar docenas de clases relacionadas con el procesamiento de texto en el paquete eclipse jface text *
Un paso más. a la aplicación
Los programas Java generalmente se publican en forma de archivos de clase. La ejecución de clases requiere el soporte de JRE o JDK. Esta es otra debilidad fatal de los programas GUI de Java. número de usuarios, independientemente de la función de su programa. No importa cuán simple sea o cuán simplificado sea su código, debe pedirles a los usuarios que descarguen un M JRE. Eso es algo muy frustrante y, para los programadores, Clase generalmente significa el. exposición del código fuente y descompilación. Las herramientas permiten a aquellos con motivos ocultos obtener fácilmente su código fuente. Aunque existen muchos métodos de cifrado para Class, siempre van a expensas del rendimiento. Afortunadamente, tenemos otras formas de compilar Class en archivos exe. !lishixinzhi/Artículo/programa/Java/gj/201311/27737