La Red de Conocimientos Pedagógicos - Currículum vitae - Diseño de aplicaciones de escritorio Java: Introducción a SWT

Diseño de aplicaciones de escritorio Java: Introducción a SWT

Obviamente, el prestigio del lenguaje Java es extremadamente inconsistente con sus logros en aplicaciones de escritorio (programas GUI). Hasta ahora, todavía es raro ver un programa de escritorio Java de mucho éxito. Aunque existen grandes programas de software como JBuilder Netbean JProbe como representantes, esto todavía no prueba que los programas Java GUI sean exitosos. Su apariencia siempre es incompatible con otro software bajo la misma plataforma del sistema operativo. La demanda de ordenadores parece ser insaciable, lo que hace que los ordenadores sólo sean tolerados por algunos programadores que siempre tienen el PC de mayor rendimiento disponible, o por usuarios profesionales a los que 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. El Standard Widget Toolkit (SWT) podría ser el fin de las pesadillas de Java. Los programadores de Ava finalmente pueden desarrollar programas GUI eficientes que tengan una apariencia estándar. Casi nadie puede decir que su programa está escrito en Java. Más importante aún, estos programas en sí son SWT multiplataforma, que es solo un conjunto de API de interfaz gráfica subyacente escritas por la organización Eclipse para desarrollar el entorno IDE de Eclipse. Tal vez sea involuntario, tal vez sea intencional. Hasta ahora, ha superado a AWT y SWING proporcionados por SUN en términos de rendimiento y apariencia. Actualmente, Eclipse IDE se ha desarrollado hasta la versión SWT, que es muy estable. La estabilidad aquí debería incluir dos significados.

En primer lugar, se refiere a la estabilidad del rendimiento. La clave es el concepto de diseño de SWT, que maximiza el componente gráfico API del sistema operativo. En otras palabras, siempre que el sistema operativo proporcione los componentes gráficos correspondientes, SWT simplemente los llama a través de la tecnología JNI y solo simula aquellos componentes que no proporciona el sistema operativo. Se puede ver que la estabilidad del rendimiento SWT depende en la mayoría de los casos de la estabilidad de los componentes gráficos correspondientes.

Otra estabilidad significa que los nombres y estructuras de los métodos de clase en el paquete API SWT rara vez cambian. Los programadores no tienen que preocuparse de que el código de su programa cambie demasiado debido al rápido desarrollo de Eclipse (Eclipse IDE lanza una versión de Nightly todos los días). La actualización de una versión de SWT a otra normalmente sólo requiere reemplazar el paquete SWT.

El primer plan SWT

Iniciemos un programa SWT (tenga en cuenta que los siguientes ejemplos e instrucciones son principalmente para la plataforma Windows, otros sistemas operativos deberían ser similares). Primero, deberíamos encontrar el paquete SWT en el archivo de instalación de Eclipse. La organización de Eclipse no proporciona descargas de paquetes SWT por separado. Debemos descargar el entorno de desarrollo completo de Eclipse para obtener el paquete SWT. SWT es un complemento para el entorno de desarrollo de Eclipse. Component Forms puede buscar archivos SWT JAR en muchos subdirectorios en la ruta ${su ruta de instalación de eclipse}\plugins. El archivo JAR encontrado contiene todos los archivos de clase Java de SWT. Debido a que SWT aplica la tecnología JNI, también necesita encontrar el archivo de biblioteca de localización JNI correspondiente. Debido a las diferentes versiones y plataformas operativas, los nombres de los archivos de biblioteca localizados serán ligeramente diferentes. Por ejemplo, SWT WIN DLL se encuentra en la plataforma Windows Eclipse. Biblioteca dinámica de compilación, la extensión del archivo de biblioteca de la versión correspondiente en la plataforma Unix debería ser así, etc. Tenga en cuenta que Eclipse es un proyecto de código abierto, por lo que también puede encontrar el código fuente de SWT en estos directorios, lo que creo que será útil para el desarrollo. A continuación se muestra el código para abrir una ventana vacía (solo método principal).

Importar e como ejemplo; public class OpenShell { public static void main(String[]args){ Display Display = new Display() Shell = new shell (display()); //Inicia un ciclo de manejo de eventos hasta que el usuario cierra la ventana.

shell isDisposed()) { if(!display readAndDispatch()) display sleep(); } dispose() }}

Asegúrese de que el archivo SWT JAR esté incluido en el classpath. Primero compile el programa de muestra con Javac y luego ejecute la ruta de la biblioteca java Djava = $ {la ruta donde se encuentra el archivo de la biblioteca local SWT} e Un OpenShell de muestra, como la ruta donde se encuentra SWT WIN DLL es c:\swtlib El comando La ejecución debe ser Java DJ ava Library path = c:\swtlib eUn ejemplo de shell abierto. Después de una ejecución exitosa, se abrirá una ventana vacía.

Análisis de SWT API

Analicemos más a fondo la composición de SWT API. Todas las clases SWT utilizan eclipse swt como prefijo del paquete. Para simplificar la explicación, usamos * para indicar el prefijo eclipse swt. Por ejemplo, el paquete *widgets representa el paquete de widgets swt de eclipse.

Nuestros componentes gráficos más utilizados se incluyen básicamente en los dos componentes más importantes del paquete de widgets, como Button Combo Text Label Sash Table, que es Shell y Composite Shell, que es equivalente a la ventana principal. marco de la solicitud. En el código de muestra anterior, el componente Shell se usa para abrir una ventana vacía y Composite es equivalente al objeto Panel en SWING. Cuando queremos agregar algunos componentes a una ventana, es mejor usar Composite como contenedor para otros componentes y luego ir al paquete *Layout para encontrar el método de diseño apropiado. SWT también utiliza una combinación de diseño y datos de diseño en SWING o AWT. Los cuatro diseños y sus correspondientes objetos de estructura de diseño (datos de diseño) se pueden encontrar en el paquete de diseño. El paquete personalizado contiene extensiones para algunos componentes gráficos básicos. Por ejemplo, CLabel es una extensión del componente de etiqueta estándar, y puede agregarle texto e imágenes al mismo tiempo. StyledText es una extensión del componente de texto, que proporciona texto enriquecido. funciones, como configurar un color de fondo, color de primer plano o fuente para el texto, el nuevo modo StackLayout también se puede encontrar en el paquete de personalización *.

La respuesta de SWT a las operaciones del usuario, como eventos del mouse o del teclado, también utiliza el modo de observador en AWT y SWING. En el paquete de eventos *, puede encontrar la interfaz de escucha y el objeto de evento correspondiente de monitoreo de eventos, como la interfaz de monitoreo MouseEvent comúnmente utilizada MouseListener MouseMoveListener y MouseTrackListener y el objeto de evento correspondiente MouseEvent.

* El paquete de gráficos puede encontrar la fuente del cursor de la imagen o la API de dibujo. Por ejemplo, se pueden llamar diferentes tipos de archivos de imagen en el sistema a través de la clase Imagen, y el componente de imagen o la función de dibujo de la pantalla. implementarse 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 llamar fácilmente a través del paquete *ole win, lo que hace posible incrustar el navegador IE o Word Excel en un programa Java.

Un programa más complejo

Mostramos un programa más complejo que el ejemplo anterior. Esta aplicación 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 tener un tamaño y diseño razonables para los cuadros de texto y botones, aquí se utiliza el método de diseño GridLayout, que es el método de diseño más comúnmente utilizado y más potente en SWT. Casi todos los formatos se pueden implementar a través de GridLayout. El siguiente proceso también implica cómo aplicar recursos del sistema (color) y cómo liberar recursos del sistema.

private void init Shell(Shell Shell){//Establece el objeto de diseño Gridlayoutgshelllay = newGridlayout(); shell set layout(gShellLay);//Construye un componente compuesto como contenedor para cuadros de texto y claves. Panel compuesto = Nuevo compuesto (Shell SWT Ninguno); //Especifique el objeto de estructura de diseño del panel. Aquí, el panel puede ocupar tanto espacio como sea posible en el shell, es decir, todas las ventanas de la aplicación. datos de la cuadrícula gpaneldata = Nuevos datos de la cuadrícula (datos de la cuadrícula Tomar _ Horizontal | datos de la cuadrícula Tomar _ Vertical | datos de la cuadrícula Rellenar _ Ambos); Los cuadros de texto y los botones se mostrarán de acuerdo con este objeto de diseño gridlayoutgpanellay = newgridlayout(); Diseño de configuración del panel (gPanelLay); // Genera un color de fondo para el panel: color final bk color = new color(display get current()); Fondo de configuración del panel (color negro); // Generar texto final del cuadro de texto = nuevo texto (panel swt multi | swt wrap); // Especifica el objeto de estructura de diseño del cuadro de texto. Deje que el cuadro de texto ocupe tanto espacio como sea posible en el panel. datos de la cuadrícula gtextdata = Nuevos datos de la cuadrícula (datos de la cuadrícula Tomar _ Horizontal | datos de la cuadrícula Tomar _ Vertical | datos de la cuadrícula Rellenar _ Ambos texto setLayoutData(gTextData); //Generar botón botón = nuevo botón(panel swt push setText); Push); //Especifica el evento del mouse Butt addmouse listener(New Mouse adaptor(){ Public Void MouseDown(Mouse Event E){//Muestra el texto del mensaje cuando el usuario hace clic en el botón setText(Hello SWT);} };// Cuando se cierra la ventana principal Cuándo, se activará DisposeListener Color de fondo shell addDisposeListener(new DisposeListener(){ public void widget disposed(dispose event e){ bkcolorDispose();} };}

Cambiar initShell. () en este código Agregue el método al primer ejemplo de apertura de una ventana vacía y podrá obtener una aplicación GUI completa que se puede ejecutar correctamente. Consulte el primer ejemplo para conocer el método de operación. recursos del sistema

En los sistemas operativos gráficos, los desarrolladores deben llamar a los recursos del sistema, como imágenes, fuentes y colores. Normalmente, estos recursos son limitados y los programadores deben tener mucho cuidado al utilizarlos. ya no se utilizan, libérelos lo antes posible; de ​​lo contrario, el sistema operativo se quedará sin combustible tarde o temprano y tendrá que reiniciarse. Lo que es más grave, provocará que el sistema se bloquee. SWT está desarrollado en Java. La ventaja del lenguaje Java en sí es el mecanismo de recolección de basura JVM. Los programadores generalmente no tienen que preocuparse por la liberación de variables y el reciclaje de memoria. Entonces, ¿la operación de los recursos del sistema es la misma para SWT? La mala noticia es que SWT no utiliza basura JVM. El mecanismo de recolección maneja la recuperación de recursos por parte del sistema operativo.

Un factor clave es que el mecanismo de recolección de basura de la JVM es incontrolable, lo que significa que los programadores no pueden saber ni pedirle a la JVM que recicle recursos en un momento determinado. Esto es fatal para el manejo de los recursos del sistema. Supongamos que su programa quiere ver decenas de miles de imágenes en un bucle. El método de procesamiento convencional es cargar una imagen a la vez y luego liberar los recursos de la imagen inmediatamente y luego cargar la siguiente imagen en un bucle. Para el sistema operativo, el programa solo ocupa un recurso de imagen a la vez, pero si la JVM maneja completamente este proceso, es posible que la JVM no libere el recurso de imagen hasta que finalice la declaración del bucle. El resultado puede ser que el sistema operativo falle incluso antes de que se ejecute el programa.

Pero las buenas noticias que vienen a continuación pueden hacer que las malas noticias sean irrelevantes. ¡Con SWT, puede utilizar los recursos del sistema de forma segura comprendiendo dos sencillas reglas de oro! Se llama regla de oro porque sólo hay dos y porque son sorprendentemente simples. La primera regla es que quien la posee la libera. La segunda regla es que cuando se destruye el componente principal, el componente secundario se destruye al mismo tiempo. La primera regla es el principio de no excepciones. Siempre que el programa llame al constructor de la clase de recurso del sistema, el programa debe preocuparse por liberar los recursos del sistema en un momento determinado, como la llamada.

Fuente fuente = nueva fuente (muestra SWT normal

Entonces debes llamar a esta fuente cuando no la necesites

font dispose()); ;

Para el segundo principio, si el programa llama al método dispose() de un componente, todos los subcomponentes de este componente llamarán automáticamente al método dispose() y serán destruidos. Normalmente, la relación entre un componente secundario y un componente principal se forma cuando se llama al constructor de un componente, p.

Shell Shell = new Shell(); padre compuesto = nuevo compuesto (shell SWT NULL hijo compuesto = nuevo compuesto (padre SWT NULL);

Donde, padre El componente es); el shell, y el shell es la ventana principal del programa, por lo que no existe un componente principal correspondiente. Al mismo tiempo, el componente principal también incluye componentes secundarios. Si aplica la segunda regla llamando al método shell dispose(), la API SWT también llamará automáticamente a los métodos dispose() de los componentes padre e hijo, y también serán destruidos.

Problemas de subprocesamiento

En el sistema GUI de cualquier plataforma operativa, las operaciones de acceso a componentes o ciertas API gráficas deben estar estrictamente sincronizadas y serializadas. Por ejemplo, los componentes clave de una interfaz gráfica se pueden configurar en un estado habilitado o deshabilitado. El método de procesamiento habitual es que el usuario coloca todas las operaciones de configuración del estado clave en la cola de procesamiento de eventos del sistema GUI (lo que significa que las operaciones de acceso están serializadas) y luego las procesa en secuencia (lo que significa que las operaciones de acceso son sincrónicas). . Supongamos que el programa quiere configurar la clave en el estado deshabilitado antes de que se complete la función para establecer el estado utilizable de la clave. De hecho, este tipo de operación conducirá inevitablemente a conflictos en cualquier sistema GUI.

El lenguaje Java en sí proporciona un mecanismo de subprocesos múltiples, que no favorece la programación GUI. No garantiza la sincronización y serialización de las operaciones de los componentes gráficos. SWT adopta una forma sencilla y directa de cumplir con los requisitos de subprocesos de los sistemas GUI nativos. En SWT, generalmente hay un hilo único llamado hilo de usuario. Solo en este hilo se puede acceder a los componentes o llamar a algunas API de gráficos. Si el programa en el proceso llama directamente a estas operaciones de acceso en una línea que no es de usuario, se generará una excepción SWTExcepiton. Sin embargo, SWT también proporciona dos métodos en la clase *widget Display que brindan acceso indirecto a componentes gráficos en subprocesos que no son de usuario. Esto se logra mediante dos métodos: syncExec(Runnable) y asyncExec(Runnable). Por ejemplo,

//El programa se está ejecutando en un hilo que no es de usuario en este momento y desea agregar una clave al panel de componentes.

display get current()async exec(new Runnable(){ public void run(){ Botón trasero = nuevo botón(panel SWT push setText(push }}); p>

La diferencia entre syncExec() y asyncExec() es que el primero regresará después de que se ejecute el subproceso especificado, mientras que el segundo regresará al subproceso actual inmediatamente independientemente de si se ejecuta el subproceso especificado.

Extensión SWT JFace

La relación entre JFace y SWT es como la relación entre Microsoft MFC y SDK. JFace está desarrollado en base a SWT. La API es más fácil de usar que SWT, pero las funciones no son tan directas como SWT. Por ejemplo, el siguiente código abre un cuadro de diálogo de alerta aplicando un MessageDialog en JFace.

MessageDialog openWarning (mensaje de advertencia para padres);

Si solo usa SWT para completar la declaración de función anterior, ¡no tendrá menos de 100 líneas!

JFace se escribió originalmente como un conjunto de API para hacer más conveniente trabajar con SWT. Su objetivo principal es desarrollar el entorno IDE de Eclipse, no aplicarlo a otras aplicaciones independientes. Por lo tanto, antes de la versión de Eclipse, era difícil separar completamente la API de JFace de la API principal de Eclipse, y siempre se importaban algunos núcleos de Eclipse que no eran de JFace. Solo las clases de código o interfaces pueden obtener un paquete de desarrollo JFace sin errores de compilación, pero la organización Eclipse parece haberse dado cuenta gradualmente del importante papel de JFace en el desarrollo de aplicaciones independientes. En la versión de desarrollo, JFace también ha comenzado a convertirse en un paquete de desarrollo independiente completo como SWT, pero este paquete de desarrollo aún está cambiando (estaba usando la versión Eclipse M cuando escribí este artículo). El prefijo del paquete de desarrollo JFace comienza con eclipse jface, y el código fuente del paquete JAR también se encuentra en la ruta $ {su ruta de instalación de eclipse} \ plugins como SWT.

Para los desarrolladores, una mejor manera de desarrollar un componente gráfico es buscar en el paquete JFace si existe un método de implementación más simple. Si no necesita implementarlo usted mismo con el paquete SWT, JFace proporciona un buen soporte para cuadros de diálogo, además de varios tipos de cuadros de diálogo (como el MessageDialog utilizado anteriormente o el cuadro de diálogo con la columna Título), si lo desea. Para implementar un cuadro de diálogo personalizado, es mejor heredar de la clase Dialog en JFace, no del diálogo *widget de SWT.

Al utilizar las clases del paquete Preferencias de JFace, es fácil crear un cuadro de diálogo de configuración profesional para su propio software. Para componentes gráficos como tablas de árbol, deben estar asociados con datos mientras se muestran. Por ejemplo, para los datos mostrados en tablas, el paquete de visualización de JFace proporciona métodos de programación de vista de modelo para dichos componentes, lo que hace que la visualización y los datos estén más separados. Propicio para el desarrollo y mantenimiento de JFace. La funcionalidad más proporcionada es para procesar contenido de texto. Se pueden encontrar docenas de clases relacionadas con el procesamiento de texto en el paquete eclipse jface text*.

Un paso más hacia 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, que es otra debilidad fatal de los programas GUI de Java. Imagínese, para una aplicación que enfrenta una gran cantidad de usuarios, no importa cuán simple sea la función de su programa y cuán simplificado sea el código, debe pedir a los usuarios que descarguen un M JRE. Qué cosa tan frustrante para los programadores. En términos generales, las clases suelen significar la exposición del código fuente, y las herramientas de descompilación pueden permitir fácilmente que personas con motivos ocultos obtengan su código fuente. Aunque existen muchos métodos de cifrado para clases, siempre van en detrimento del rendimiento. Afortunadamente, existen otras formas de compilar Class en archivos exe.

Lishi Xinzhi/Article/program/Java/gj/201311/27737