SWT-JFace

From ChuWiki
Jump to navigation Jump to search

Descripción[edit]

SWT: Standard Widget Toolkit[edit]

Normalmente la primera opción a la hora de realizar una GUI en Java es usar AWT/Swing que ya viene en la librería estándar de Java. Pero los resultados son bastante pobres y aunque se puede simular y cambiar el "look and feel" de las interfaces, se sigue notando a tres pueblos que es una aplicación Java (son feas de cojones, reconócelo!). SWT es un toolkit para crear GUIs creado por IBM y mantenido por la fundación Eclipse que implementa los widgets usando código nativo del SO (a decir verdad SWT es casi todo C, diferente para cada plataforma), lo cual se traduce a que no se diferencia si es Java u otra tecnología, pues se ven igual que cualquier otra aplicación propia del SO donde se está ejecutando.

Para que una aplicación que use SWT funcione, requiere la librería SWT (el .jar) concreta del SO. Es decir, tienes un SWT-linux-gtk-vXXX.jar, un SWT-windows-vXXX.jar, etc... En tiempo de compilación, es indiferente uno que otro. Mayormente porque lo que cambia es la implementación dentro de SWT de los widgets, que es dependiente del SO.

JFace[edit]

Es una librería que usa SWT para facilitar ciertas labores en la creación de GUIs o incluir nuevos widgets de más alto nivel. Básicamente añade funcionalidad a la librería básica de SWT. Es independiente del SO.

Ejemplos, aplicaciones que usan SWT[edit]

  • Eclipse (IDE definitivo)
  • Azureus (cliente bittorrent)
  • Sancho (front-end mldonkey)

Uso[edit]

Las librerías necesarias para usar SWT+JFace son:

  • org.eclipse.swt.swt-gtk-linux-XXX.jar (o org.eclipse.win.win32-XXX.jar)
  • org.eclipse.jface.jface-XXX.jar
  • org.core.commands-XXXX.jar
  • org.eclipse.equinox.equinox-common-XXXX.jar

Las tres últimas son para JFace.

Para obtener estas librerías, se pueden descargar de la web de Eclipse (Web de SWT), aunque dado que estamos programando en Java, lo normal y humanamente lógico sería estar usando Eclipse, por lo que estas librerías ya las tenemos! (pues Eclipse las usa). Para ello debemos añadirlas al Build Path: clic derecho en el proyecto, properties; menu Java Build Path, pulsamos Add Variable, seleccionamos ECLIPSE_HOME, pulsamos Extend y ahí estarán todas las librerías. Añadimos las mencionadas anteriormente y ya está, ya podemos compilar y ejecutar. Sin olvidarnos que para distribuir la aplicación se requerirá la inclusión de estas librerías.


Tips[edit]

  • Si existe, usa cosas de JFace antes que directamente de SWT, pues te da un mayor nivel de abstracción.
  • Muchas, muchas cosas, dentro de JFace, se hacen sobrecargando métodos (para hacer un Dialog heredas de una clase y sobrecargas el método createComponents para crear el contenido, por ejemplo).
  • En la clase org.eclipse.swt.SWT tienes tropecientas constantes para darles estilos a diferentes widgets, layouts, etc... Es un método un poco caótico pues tienes mezcladas mogollón de constantes, las cuales son usadas en contextos diferentes, pero así son las cosas.
    • Por ejemplo new Composite(parent.getShell(), SWT.NONE) o new Composite(parent.getShell(), SWT.BORDER)
  • Para el layout aunque estés acostumbrado al GridBagLayout de Swing u otras APIs (en SWT el equivalente se llama GridLayout), el FormLayout es mucho más potente y fácil. Declaras la posición de los elementos estilo Web, les pones restricciones para cada extremo (top, left, right, bottom), estas restricciones pueden ser tanto valores absolutos, como porcentajes, como otros elementos. Con este método puedes decir, por ejemplo, "este botón me lo pones debajo del Text de antes y a la derecha de este me pones otro, ele".
    • Aquí ponemos el elemento 'unElemento' arriba del todo y con una anchura del 100% y ocupando el 75% del alto de su contenedor. Luego se pone un Composite justo debajo de él (hereda sus propiedades, es decir, estará alineado a la izquierda y con el 100% de ancho)
 FormData layoutData = new FormData();
 layoutData.top = new FormAttachment(0, 0);
 layoutData.left = new FormAttachment(0, 0);
 layoutData.right = new FormAttachment(100);
 layoutData.bottom = new FormAttachment(75);
 unElemento.setLayoutData(layoutData);
 
 otroElemento = new Composite(content, SWT.BORDER);
 layoutData = new FormData();
 layoutData.top = new FormAttachment(unElemento);
 otroElemento.setLayoutData(layoutData);

Recursos[edit]