Componentes Swing
Forman parte de las Java Foundation Classes y, constituyen un conjunto de componentes de interfaz de usuario, lightweight, construdas bajo la infraestructura del AWT. Son un reemplazo lightweigth de las componentes heavyweight del AWT. Adems Swing provee mltiples componentes de GUI que no estn presentes en el AWT (tabbed pane, toolbar, color chooser, table, tree, dialog boxes). Proveen soporte para implementar interfaces de usuario grficas con look and feel pluggable (las componentes Swing pueden conservar su apariencia en plataformas diferentes), tienen incorporado un mecanismo de double buffering, pueden ser transparentes.
Componentes Swing
Swing contiene alrededor de 250 clases. Para distinguir las clases que son componentes de interfaz de usuario de aquellas que son de soporte, los nombres de las componentes Swing comienzan con J. Algunos de los paquetes que componen Swing son:
[Link] [Link] [Link] [Link] [Link] Componentes Swing Bordes para componentes Swing Clases de eventos e interfaces listener Clases de soporte para JTable Clases de soporte para JTree
Componentes Swing y AWT
Swing se construy por encima del AWT. Swing usa la infraestructura provista por el AWT: objetos grficos, colores, fonts, layout managers, etc. Todas las componentes Swing son subclase de [Link] (es lightweight, no tiene peer), que a su vez es subclase de [Link]. Swing NO usa las componentes de GUI del AWT, excepto Frame, Window y Dialog, que son las superclases de las componentes Swing, JFrame, JWindow y JDialog, respectivamente.
JFrame JWindow JDialog
Swing Heavyweight Components Frame, Window, Dialog
Swing Lightweight Components
AWT
Component, Container, Graphics, Color, Font, Toolkit, Layout Managers, etc.
Arquitectura de las Componentes Swing
Swing est basada en una versin especializada de la arquitectura Model View Controller. Las componentes Swing lightweigth comprenden los siguientes objetos: Un modelo que mantiene los datos de la componente y provee mtodos para accederlos. Un UI delegate que es el responsable de pintar la componente (look) y manejar sus eventos (feel). Una componente que es subclase de JComponent. Los controllers en Java son los objetos listeners. Usualmente los listeners Swing se implementan como clases internas de los objetos UI delegate. Swing provee una API para manipular objetos de interfaz de usuario. La creacin de los objetos UI delegate y de los modelos es transparente para el programador.
Applets y Aplicaciones Swing
Las applets y aplicaciones que usan componentes Swing deben extender las clases JApplet (subclase de [Link]) y JFrame (subclase de [Link]), respectivamente. JApplet y JFrame soportan Swing. Se recomienda extender estas clases para implementar applets y aplicaciones que usan Swing. Todos los contenedores Swing de nivel de ventana contienen una instancia de de la clase JRootPane (JApplet, JDialog, JFrame, JInternalFrame y JWindow). Esta instancia incluye un contenedor llamado content pane (instancia de JPanel), donde estarn contenidas todas las componentes. Swing define la interface, RootPaneContainer que implementan todos los contenedores Swing mencionados. Por lo tanto, tanto JApplet como JFrame son contenedores que tienen asociado una instancia de la clase JRootPane. En el content pane del JRootPane residen todas las componentes del applet o aplicacin.
La Clase JApplet
Las componentes de GUI deben ser agregadas al content pane en vez de ser agregadas directamente al applet (como en AWT). Adicionalmente, el layout manager se establece sobre el content pane y no directamente sobre el applet Swing. El manejador de layout para JApplet es el BorderLayout. JFrame usa el mismo y de esta manera se facilita la migracin de applets a aplicaciones y viceversa. Un applet obtiene una referencia a su content pane, invocando al mtodo getContentPane() de Japplet. Las instancias de JApplet pueden tener una barra de menes (no era posible en las applets AWT) que se especifica mediante el mtodo setJMenuBar(JMenuBar) de JApplet. Tambin es posible agregar una barra de men al applet, instanciando JMenu y agregando dicho objeto al content pane.
Ejemplo de un Applet Swing
import [Link].*; import [Link].*; import [Link].*; public class Test extends JApplet { public void init() { Container contentPane = getContentPane(); Icon icon = new ImageIcon("[Link]", Una animacin"); JLabel label = new JLabel("Swing!", icon, [Link]); [Link](label, [Link]); } }
Se agrega el label al content pane del applet Ubica el label en el centro del content pane
A diferencia de Applet, las JApplet usan como layout manager de default al BorderLayout.
La Clase JComponent
La clase JComponent es la clase base de todas las componentes Swing (lightweigth). Es la superclase de todas las componentes Swing lightweight. JComponent es subclase de [Link], que a su vez es subclase de [Link], por lo tanto todas las componentes Swing son contenedores AWT. JComponent provee a todas sus subclases de una amplia funcionalidad. Bordes Soporte de Accesibilidad Double buffering Debug graphics Autoscrolling Tooltips Manejo de abreviaturas
Bordes
Todas las subclases de JComponent puede tener un borde (excepto JViewPort). Los bordes de la componentes se establecen, creando el borde deseado y luego invocando al mtodo setBorder(Border) pasando como parmetro el borde previamente creado. Los bordes se dibujan adentro de la componente, pero los bordes no son componentes.
import [Link]; import [Link].*; import [Link].*; public class Test extends JApplet { public void init() { JPanel panel = new JPanel(); [Link](new TitledBorder("JPanel Border")); getContentPane().add(panel, [Link]); } } El applet crea un titled border que es pasado como parmetro al setBorder.
Estilos de Bordes provistos por Swing
Bordes
Existen distintos estilos de bordes y cada uno de ellos se corresponde con una clase en el paquete [Link]. Por ejemplo: [Link], [Link], etc. Un mismo borde puede ser usado para decorar diferentes componentes. Para ello Swing provee la clase BorderFactory que permite construir instancias de bordes compartidos. La clase BorderFactory provee mtodos de clase que retornan instancias de todos los bordes. Border border =[Link](); Border border2 =[Link]();
JPanel [Link](border); JPanel [Link](border2);
..................................... ..........................................................................
Usar la clase BorderFactory evita importar el paquete [Link] y hace ms eficiente el uso de bordes ya que la fbrica devuelve instancias compartidas (para los bordes simples). Para los bordes que tienen propiedades como ttulos, las instancias son nicas. Es posible crear bordes customizados, subclaseando la clase AbstractBorder y sobreescribiendo los mtodos necesarios. Usualmente se sobreescriben los mtodos: paintBorder, getBorderInsets e isOpaque (retornando true, si la componente pinta todos los pixels del borde, ya que default retorna false).
Double buffering
El double buffering, es una tcnica, que elimina el parpadeo producido cada vez que parte de toda una componente se actualiza en la pantalla. Las componentes Swing son double buffering, esto significa que el background se limpia y la componente se vuelve a pintar en un buffer offscreen y, luego este buffer se copia en la pantalla. El buffer offscreen es lo suficientemente grande como para poder contener todas las componentes Swing del contenedor. Las componentes se dibujan en el buffer offscreen y subsecuentemente se copian en la pantalla. La propiedad de double buffering puede ser establecida sobre una componente particular. Sin embargo, prevalece la configuracin realizada por el contenedor, esto es, toda componente es automticamente double buffer si su contenedor lo es. Las componentes Swing JRootPane y JPanel son double buffer por default.
Double buffering
La propiedad de double buffer se hace disponible mediante los siguientes mtodos de la clase [Link]:
public void setDoubleBuffered(boolean o) public boolean isDoubleBuffered()
Los programas que usan componentes Swing, no necesitan hacer nada especial para soportar double buffering. Swing asegura que el tipo apropiado de objeto Graphics (imagen offscreen en caso de double buffer una imagen normal) ser pasado como parmetro al mtodo paint(). Por lo tanto, la componente solamente debe ocuparse de dibujar en l.
Componentes Opacas Transparentes
Las componentes Swing pueden ser opacas parcialmente transparentes.
Componente Opaca
Componente Transparente
Una componente que NO pinta TODOS sus bits asociados es parcialmente transparente. En otro caso, es opaca. Una componente transparente cada vez que es repintada primero debe repintar la porcin del contenedor que intercepta.
Componentes Opacas Transparentes
La [Link] provee los mtodos:
public void setOpaque()
True, la componente pinta todos sus bits False, la componente no garantiza que se pinten todos sus bits
public boolean isOpaque()
El sistema de pintado de Swing usa la propiedad de no transparente opaco de una componente para determinar si es necesario repintar no a sus ancestros (ante un pedido de actualizacin de la componente). La mayora de las componentes Swing por default son opacas. Ej: A los Pushbuttons, ser transparentes les permite tener apariencia no-rectangular.
El mtodo paint() en Swing
De la misma forma que las componentes AWT, las Swing son mostradas en la pantalla invocando el mtodo paint(Graphics g) de la clase [Link]. El mtodo paint(Graphics g) de JComponent considera que la componente puede ser double buffer, puede tener borde y que puede contener otras componentes. Estructura del protected void paintComponent(Graphisc g) mtodo paint(Graphics g) protected void paintBorder(Graphisc g) protected void paintChildren(Graphisc g) El programador que usa Swing, NO debe sobreescribir el mtodo paint(), solamente se debe sobreescribir el mtodo paintComponent().
El mtodo paint() en Swing
Como ya hemos visto, las componentes Swing tienen asociado un objeto UI delegate, que es el responsable del look and feel de la componente. Por lo tanto, el pintado de las componentes estndares se delega en este objeto. Esto ocurre en el mtodo paintComponent(). paint() paintComponent() [Link]() [Link]()
Si la componente es opaca, se limpia el background y luego se invoca al paint() de la componente
Pintar Componentes Swing
Originado por el ancestro heavyweigth
1 Se invoca al mtodo [Link]() 2 apropiado (si double buffer est habilitado).
offscreen si double buffer est habilitado) Se convierte el objeto Graphics en un objeto Graphics offscreen
Para cada una de las componentes lightweigth
3 Se invoca al paintComponent() sobre la componente (usando la imagen 4 Se invoca al paintBorder() sobre la componente (usando la imagen
offscreen si double buffer est habilitado)
5 Se invoca al paintChildren() sobre la componente (usando la imagen
offscreen si double buffer est habilitado). Este mtodo usa el rectngulo de dibujo de la componente, la propiedad de transparencia para determinar sobre que descendientes invocar al paint() pantalla
6 Si double buffer est habilitado, se copia la imagen offscreen sobre la
Pintar Componentes Swing
Originado por una invocacin al [Link]()
Usa el rectngulo de dibujo de la componente y la propiedad de transparencia para determinar la componente raz a partir de donde comienza la operacin de pintado Se convierte el objeto Graphics en un objeto Graphics offscreen apropiado (si double buffer est habilitado en la componente raz) Se invoca al paint () sobre la componente raz (luego se realizan los pasos 3, 4 y 5) Si double buffer est habilitado sobre componente raz, se copia la imagen offscreen sobre la pantalla
Pluggable Look and Feel
La clase [Link] maneja informacin acerca del look and feel de las applets y aplicaciones Swing. Provee acceso a la siguiente informacin y servicios, mediante mtodos de clase: Establece el look and feel de applets aplicaciones Provee acceso a los valores del look anf feel actual Carga propiedades para Swing de un archivo de propiedades El mtodo [Link]() establece el valor actual del look and feel. Los valores posibles son: [Link], [Link] [Link] [Link]
Soporte de Accesibilidad
El objetivo del soporte de accesibilidad es hacer que el software sea accesible para todas las personas. JFC soporta accesibilidad de tres formas diferentes:
Look and Feel Pluggable API de Accesibilidad Servicios de Accesibilidad
Swing fue diseado para soportar look & feel pluggable. De esta forma es posible implementar look and feels alternativos para las componentes. Por ejemplo, reemplazar el look and feel visual de las componentes por uno basado en voz, para usuarios con problemas de visin adaptar las componentes que tienen aspectos de audio con un look and feel que muestre subttulos cada vez que se reproduce el audio (para usuarios con dificultades auditivas). La API de Accesibilidad, permite que las componentes de interfaz de usuario le brinden informacin a las tecnologas que ayudan a usuarios discapacitados. La clase AccesibleContext define un conjunto bsico de informacin que la componente debe proveer.
Soporte de Accesibilidad
La clase AccesibilityContext provee mtodos como:
getAccesibleRole(): identifica el rol de la componente de interfaz de usuario que a su vez identifica el tipo de componente. getAccesibleName(), getAccesibleDescription(): obtiene informacin especfica sobre una componente (acerca de la funcionalidad especfica de una instancia de una componente).
JComponent tiene incorporado el soporte para brindar informacin de accesibilidad. Todas las componentes Swing tienen la capacidad de obtener su informacin de accesibilidad. ......................
JTextField unTexto = new JTextField(); AccesibleContext unContextodeTexto = [Link](); [Link](Apellido); [Link](Tipee su Apellido);
Tooltips
Los tooltips son una lnea de texto que se despliegan en una ventana cuando el cursor permanece apoyado sobre una componente por un perodo de tiempo especfico. Ese tiempo se llama retardo inicial y el valor por defecto es 750 milisegundos. Un tooltip se asocia a una componente invocando el mtodo setToolTipText(string) de la clase JComponent. El parmetro string representa el texto que ser desplegado en la ventana del tooltip. Los tooltips no soportan mltiples lneas de texto. Las reglas de buen diseo de GUI establecen que los tooltips tienen que ser cortos y precisos. Los tooltips finalizan debido a: a) el curso abandona la componente, b) se presiona el mouse c) expira el retardo final (4 segundos). Cuando el cursor deja una componente que mostraba un tooltip, comienza a funcionar otro retardo (0.5 seg.). Si el cursor entra a otra componente equipada con un tooltip, este se muestra inmediatamente. Es posible personalizar los tooltips fijando los valores de estos tiempos invocando mtodos de clase de la clase ToolTipManager.
Tooltips
import [Link].*; import [Link].*; public class ToolTipTest extends JApplet { public void init() { Container contentPane=getContentPane(); JButton botoncito = new JButton(Tengo un tooltip); [Link](Soy un Botoncito"); contentPane().setLayout(new FlowLayout()); contentPane().add(botoncito); } } La clase JComponent provee mltiples opciones para setear tooltips y para personalizar su comportamiento, como por ejemplo establecer la posicin del tooltip (de acuerdo a la posicin es el texto que se muestra).
Debug graphic
El debug graphic permite a los programadores entender exactamente cmo las componentes se dibujan sobre la pantalla. Esto es especialmente til cuando se implementan componentes de UI customizadas. Swing provee la clase [Link], subclase de [Link] que disminuye la velocidad con que las operaciones grficas son realizadas. Invocando mtodos de clase de la clase DebugGraphics, es posible establecer el nmero de flashes por operacin, el color del flash, etc. Invocando al mtodo setDebugGraphicsOptions(int) de JComponent es posible obtener informacin de debug, como por ejemplo que se abra una ventana que muestre el buffer offscreen de una componente double buffer. El argumento int indica la opcin de debug.
Autoscrolling
JComponent soporta autoscrolling. De esta manera, las componentes tienen la capacidad de rolar cuando el mouse es arrastrado afuera de las cotas de la componente. El autoscrolling se activa y desactiva invocando al mtodo setAutoScrolls(boolean) de la clase JComponent. Adems es posible consultar el estado del autoscrolling de una componente mediante el mtodo getAutoScrolls(). Por default, el autoscrolling est habilitado solamente para listas y tablas. Por ejemplo, si tenemos una componente JLIST de seis elementos y se fijan como visibles solamente tres, entonces como por defecto est habilitado el scrooling en listas, la lista se mostrar en un srollpane. Implementar el autoscrolling en una componente customizada requiere que la componente maneje el evento mouse dragged (especificado por la interfaz MouseMotionListener) que ocurre afuera de las cotas de la componente.
Manejo de abreviaturas
La clase JComponent provee una facilidad para manejo de abreviaturas. De sta forma, se evita a los programadores que filtren las abreviaturas. Las componentes Swing pueden disparar eventos y delegar su manejo a un listener especfico cuando una abreviatura es tipeada. El mtodo registerKeyboardAction(ActionListener, KeyStroke, int) de la clase JComponent registra una abreviatura sobre la componente. Cuando la abreviatura es tipeada, el mtodo actionPerformed() es invocado si la condicin dada por el parmtero int se cumple (por ej. cuando la componente tiene el focus); el mtodo getRegisteredKeyStrokes() devuelve todas las abreviaturas asociadas a una componente. Las condiciones bajo las cuales son manejadas las abreviaturas se especifican mediante constantes enteras de la clase JComponent:
WHEN_FOCUSED WHEN_ANCESTOR_OF_FOCUSED_COMPONENT WHEN_IN_FOCUSED_WINDOWS