Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Programación Con Swing: Noelia Méndez Fernández Jose Luis García Valiente
Programación Con Swing: Noelia Méndez Fernández Jose Luis García Valiente
Junio, 2005
RESUMEN
Este documento pretende hacer una descripcin de Swing, una de las APIs de Java, que se
incluye en las JFC 1.1.
En primer lugar se hace una introduccin a Swing, describiendo el entorno en el que se
encuentra, tratando por ello algunos aspectos relacionados con AWT, JFC 1.1 y JDK 1.2.
Adems, se realiza una breve descripcin de las interfaces de usuario.
Posteriormente, se describe Swing con ms profundidad, analizando su arquitectura y sus
componentes principales.
A continuacin, se hace una pequea introduccin al manejo de eventos en Swing y a los
Applets.
Finalmente, se analiza por qu es til convertir una aplicacin a Swing y se dan unas
indicaciones para facilitar la conversin.
Y por ltimo, se explican varios ejemplos de aplicaciones con Swing.
ABSTRACT
This document tries to make a description of Swing, one of the APIs of Java, which is included
in JFC 1.1.
First of all, this document makes an introduction to Swing, describing the IDE where it is,
dealing with some aspects related to AWT, JFC 1.1 and JDK 1.2. Besides, a short description
about the interfaces of user is made.
Afterwards, Swing is described more deeply, analysing its architecture and main
components.
Later, a small introduction about the management of events in Swing and the Applets is
made.
Eventually, why is useful to convert an application into Swing is analysed and some
indications are given to make easy the conversion.
Finally,
some
examples
about
applications
with
Swing
are
explained.
LISTA DE CONTENIDOS
-
LISTA DE FIGURAS
LISTA DE TABLAS
-
1.
INTRODUCCIN AL TRABAJO
Este trabajo pretende ser una pequea introduccin a Swing, con la que se intenta mostrar al
lector una visin general sobre el mundo de las interfaces grficas de usuario, y ms
concretamente, sobre el desarrollo de stas con Java y sus APIs. Puesto que tan slo se trata de
una breve introduccin al tema, lo que se pretende es captar la atencin del lector y mostrar las
ventajas que ofrece ste tipo de programacin.
En primer lugar, se realiza una introduccin a Swing, el AWT y las interfaces de usuario,
tratando de sta forma de centrar al lector en el tema a tratar.
Una vez realizada dicha introduccin, se describir brevemente el paquete Swing, para dar
una idea de la jerarqua de componentes que se puede utilizar con Swing y de sus utilidades.
Tambin se mencionar el manejo de eventos en Swing, as como los Applets, aunque de
una forma muy superficial, ya que debido a la gran amplitud de variaciones que pueden darse,
sera muy extenso hacer una descripcin detallada.
A continuacin, se exponen los motivos por los que resulta interesante convertir las
aplicaciones a Swing.
Para terminar, se examinarn ms concretamente dos de las clases que ofrece Swing: la
clase Tabbed Pane y la clase Menu.
Para aquellas personas que despus de leer este documento se sientan atradas por la
construccin de interfaces grficas de usuario con Swing, al final del documento se incluyen las
referencias, para facilitar la bsqueda de informacin a todo el que desee profundizar en el
tema.
2.
INTRODUCCIN A SWING
Swing es una de las mejoras principales que ha experimentado el JDK en su versin 1.2 con
respecto a la versin 1.1, y representa la nueva generacin de AWT. Tambin es una de las API
de las Clases de Fundamentos de Java (JFC), lo cual es el resultado de un esfuerzo de
colaboracin muy grande entre Sun, Netscape, IBM y otras empresas. Lo que da a Swing su
importancia es el poder que ofrece para desarrollar interfaces grficas de usuario (GUI) para
applets y aplicaciones. La cantidad y calidad de los controles GUI que ofrece Swing no tiene
rival en ningn otro juego de herramientas GUI.
El origen de los controles GUI que presenta Swing lo encontramos en las Clases de
Fundamentos de Internet de Netscape (IFC). Los componentes Swing van ms all de las IFC,
hasta el punto de que no hay un parecido apreciable entre los componentes Swing y los de las
IFC. Swing ofrece tambin la posibilidad de cambiar fcil y rpidamente el aspecto y sensacin
(L&F) de un nico componente o grupo de componente. Esta posibilidad, que se conoce como
aspecto y sensacin conectables (PL&F), es un sello distintivo de Swing.
3.
Para poder apreciar la importancia de Swing, haremos primero una introduccin a las interfaces
de usuario y al AWT.
El interfaz de usuario es la parte del programa que permite a ste interactuar con el usuario.
Las interfaces de usuario pueden adoptar muchas formas, que van desde la simple lnea de
comandos hasta las interfaces grficas que proporcionan las aplicaciones ms modernas. El
interfaz de usuario es el aspecto ms importante de cualquier aplicacin. Una aplicacin sin un
interfaz fcil, impide que los usuarios saquen el mximo rendimiento del programa. Java
proporciona los elementos bsicos para construir interfaces de usuario a travs del AWT, y
opciones para mejorarlas mediante Swing, que s permite la creacin de interfaces de usuario de
gran impacto y sin demasiados quebraderos de cabeza por parte del programador.
6
4.
Swing
La Figura 1 muestra la relacin existente entre Swing, el AWT y las JFC. Las JFC subsumen y
amplan el AWT original, y constan de las siguientes API principales:
-
AWT.
Swing.
Java 2D.
Drag-and-Drop.
Accessibility.
Aunque Swing est separado del AWT, se implementa en trminos de clases AWT bsicas.
El AWT proporciona la interfaz entre el sistema de ventanas nativo subyacente y los
componentes GUI de Java. Swing utiliza esta interfaz, pero no se apoya en componentes del
AWT para hacer uso de objetos nativos. En lugar de ello, los componentes Swing estn escritos
en Java puro. Esto ofrece ventajas significativas. Permite a los componentes Swing ser
independientes del sistema de ventanas nativo, lo cual implica que pueden ejecutarse en
cualquier sistema de ventanas que admita el AWT. Tambin permite a los componentes Swing
ser independientes de cualquier limitacin de los sistemas de ventanas nativos. Esta
independencia permite a Swing controlar y adaptar su aspecto y sensacin (de ah la aparicin
de PL&F).
Entre los componentes nuevos que incluye Swing hay desde paneles tabulados y bordes
estilizados hasta barras deslizadoras y efectos giratorios. Estos componentes nuevos, en s
mismos, hacen que Swing constituya un agregado de primera magnitud a la API Java. La galera
de componentes Swing, que se encuentra en http://java.sun.com/products/jfc/swingdoc-
5.
6.
Swing es una API grande que consta de nueve paquetes y de numerosas clases e interfaces. La
mayor parte de componentes Swing se incluyen en el paquete java.awt.swing, el cual
ofrece asimismo clases e interfaces que admiten y manejan los componentes GUI. El paquete
java.awt.swing.border ofrece una serie de interesantes bordes que se pueden usar con
los componentes Swing. Estos bordes le ayudan a adaptar el aspecto y sensacin de los
conjuntos de componentes.
El paquete java.awt.swing.event define los eventos y auditores de eventos que
utilizan los componentes Swing. Es sin duda una buena idea examinar la lista de eventos y de
auditores de eventos para tener una idea de las interacciones de usuario que admite Swing.
El paquete java.awt.swing.table ofrece clases e interfaces que admiten el objeto
JTable enriquecido y flexible. Estas clases e interfaces se usan para adaptar las caractersticas
de muestra de una tabla.
Los paquetes java.awt.swing.text ofrecen varias clases e interfaces que admiten
componentes de texto. Estas clases e interfaces controlan el signo de intercalacin, resaltado,
formato y dems aspectos del texto que se introduce y se modifica en los componentes del texto.
El
paquete
java.awt.swing.text.html
contiene
la
clase
nica
HTMLEditorKit. Esta clase admite la implementacin de un editor HTML sencillo pero
potente. El paquete
java.awt.swing.text.rtf es parecido al paquete
java.awt.swing.text.html. Contiene la clase nica RTFEditorKit, la cual ofrece
la posibilidad de modificar Texto con Formato Enriquecido (RTF).
JComponent
AbstractButton
JButton
JMenuItem
JCheckBoxMenuItem
JMenu
JRadioButtonMenuItem
JToggleButton
JCheckBox
JRadioButton
JComboBox
JInternalFrame
JLabel
DefaultTableCellRenderer(java.awt.swing.table)
JLayeredPane
JDesktopPane
JList
JMenuBar
JOptionPane
JPanel
ColorChooserPanel
JPopupMenu
JProgressBar
JRootPane
JScrollBar
JScrollPane
JSeparator
JSlider
JSplitPane
JTabbedPane
JTable
JTableHeader(java.awt.swingn.table)
JTextComponent(java.awt.swing.text)
JEditorPane
JTextPane
JTextArea
JTextField
JPasswordField
JToolBar
JToolTip
JTree
JViewport
7.
10
11
8.
Cada vez que el usuario teclea un carcter o pulsa un botn del ratn, ocurre un evento.
Cualquier componente puede ser notificado del evento. Todo lo que tiene que hacer es
implementar el interface apropiado y ser registrado como un oyente de evento del evento fuente
apropiado. Los componentes Swing pueden generar muchas clases de evento.
El paquete java.awt.swing.event define una serie de interfaces auditoras de
eventos y clases de eventos que se usan con los componentes Swing. Adems, muchos de los
componentes Swing tambin utilizan eventos del AWT.
En la figura 3 mostramos unos pocos ejemplos:
Cada evento est representado por un objeto que ofrece informacin sobre el evento e
identifica la fuente. Las fuentes de los eventos normalmente son componentes, pero otros tipos
de objetos tambin pueden ser fuente de eventos. Como muestra la siguiente figura, cada fuente
12
de evento puede tener varios oyentes registrados. Inversamente, un slo oyente puede registrarse
con varias fuentes de eventos.
9.
APPLETS DE SWING
10.
CONVERSIN A SWING
Tener modelos separados de datos y estados hace que los componentes Swing sean
altamente personalizables y permite compartir datos entres componentes.
Los componentes Swing tienen soporte interno para accesibilidad, lo que hace que
nuestros programas pueden usarse automticamente con tecnologas asistivas.
Por lo que la pregunta sera ahora "Por qu no debo convertir a Swing?" Es razonable
posponer la conversin si pensamos que nuestros usuarios no podrn ejecutar los
programas Swing de forma conveniente. Por ejemplo, su nuestro programa es un applet
y queremos que todo el mundo pueda usarlo en internet, deberamos considerar cuantos
navegantes del Web tienen navegadores que puedan ejecutar programas Swing. En el
momento de escribir esto, la mayora de los navegadores no tienen soporte Swing
interno; los usuarios deben aadirlo descargando e instalando Java Plug-in.
13
Dado que Swing ofrece componentes GUI que son equivalentes a los componentes del AWT,
resulta fcil convertir las aplicaciones y applets a Swing. Las aplicaciones se convierten a
Swing reemplazando la clase Frame por la clase JFrame y utilizando getContentPane()
para acceder al contenedor del marco. Los componentes GUI que se hubieran aadido al Frame
se aaden al contenedor del marco. Los applets se convierten deforma parecida con la clase
JApplet reemplazando a la clase Applet. La mayor parte de los componentes GUI del
AWT pueden convertirse a Swing anteponiendo al nombre de la clase de AWT la letra J.
11.
EJEMPLOS
Puesto que Swing tiene una gran cantidad de componentes y sera demasiado extenso detallar
cada uno de stos, a continuacin se analizan de forma detallada slo dos de ellos. Para conocer
el funcionamiento del resto de los componentes, en la bibliografa se muestran algunas
referencias para encontrar la informacin necesaria.
14
Esta imagen representa una aplicacin que utiliza cuatro TabbedPane. Como podemos
apreciar, la ventana est constituida por cuatro pestaas. Una pestaa puede tener un tooltip, y
puede mostrar tanto texto como una imagen. El ejemplo muestra las pestaas en sus posiciones
por defecto, en la parte superior del TabbedPane. Podemos cambiar las posiciones de las
pestaas a la izquierda, derecha, o abajo.
Poniendo el cursor sobre una pestaa, despus de un corto tiempo, se ver una ayuda
(tooltip) asociada con la pestaa. Como conveniencia se debe aadir el texto de la ayuda
(tooltip) cuando se aade el componente al TabbedPane.
10.1.3
El API TabbedPane
Mtodo
JTabbedPane()
JTabbedPane(int)
Propsito
Crea un TabbedPane. El argumento
opcional indica dnde deberan aparecer las
pestaas.
Por defecto, las pestaas aparecen en la
parte superior. Se pueden especificar estas
posiciones (definidas en el interface
SwingConstants,
que
implementa
TabbedPane):
TOP, BOTTOM, LEFT, LEFT.
15
Mtodo
Propsito
insertTab(String, Icon,
Component, String, int)
remove(Component)
removeTabAt(int)
removeAll()
int indexOfComponent(Component)
int indexOfTab(String)
int indexOfTab(Icon)
void setSelectedIndex(int)
void
setSelectedComponent(Component)
int getSelectedIndex()
Component getSelectedComponent()
Mtodo
Propsito
void setComponentAt(int,
Component)
Component getComponentA(int)
void setTitleAt(int, String)
String getTitleAt(int)
void setIconAt(int, Icon)
Icon getIconAt(int)
mostrados
16
Qu es un Men
Un men proporciona una forma de ahorrar espacio y permitir al usuario elegir una entre varias
opciones. Otros componentes con los que el usuario puede hacer una eleccin incluyen combo
boxes, lists, radio buttons, y tool bars.
Los mens son nicos en que, por convencin, no se sitan con los otros componentes en el
UI. En su lugar, aparecen en una barra de men o en un men desplegable. Una barra de men
contiene uno o ms mens, y tiene una posicin dependiente de la plataforma, normalmente
debajo de la parte superior de la ventana. Un men desplegable es un men que es invisible
hasta que el usuario hace una accin del ratn especfica de la plataforma, como pulsar el botn
derecho del ratn sobre un componente. Entonces el men desplegable aparece bajo el cursor.
La figura 6 muestra los componentes Swing que implementan cada parte de un sistema de
mens.
10.2.2
17
Como se ve en la figura 7, los tems de mens (incluidos los propios mens) son simples
botones. Un men, a pesar de ser un botn, muestra sus tems ya que cuando se activa,
automticamente trae un men desplegable que muestra sus tems.
10.2.3
A continuacin tenemos el fragmento de cdigo que crea los mens mostrados en la figura 4.
Como este cdigo no tiene manejo de eventos, los mens no hacen nada til, excepto verse
como seran. Si se ejecuta el ejemplo, observaremos que a pesar de no tener un manejo de
eventos, los mens y submens aparecen cuando deben, y los checkbox y los botones de radio
responden apropiadamente cuando el usuario los elige.
menu.add(cbMenuItem);
cbMenuItem = new JCheckBoxMenuItem("Another one");
menu.add(cbMenuItem);
//a submenu
menu.addSeparator();
submenu = new JMenu("A submenu");
menuItem = new JMenuItem("An item in the submenu");
submenu.add(menuItem);
menuItem = new JMenuItem("Another item");
submenu.add(menuItem);
menu.add(submenu);
//Build second menu in the menu bar.
menu = new JMenu("Another Menu");
menuBar.add(menu);
Como se ve en el cdigo, para configurar una barra de men para un JFrame, se utiliza el
mtodo setJMenuBar. Para aadir un JMenu a un JMenuBar, se utiliza el mtodo
add(JMenu). Para aadir tems de men y submens a un JMenu, se utiliza el mtodo
add(JMenuItem). Estos mtodos y otros ms se listan en El API de JMenu.
10.2.4
Para detectar cuando el usuario selecciona un JMenuItem, se puede escuchar por eventos
action (igual que se hara para un JButton). Para detectar cuando el usuario selecciona un
JRadioButtonMenuItem, se puede escuchar tanto por eventos action, como por eventos
item. Para JCheckBoxMenuItems, generalmente se escuchan eventos de item.
La figura 8 muestra un programa que aade deteccin de eventos al ejemplo anterior.
18
19
Para las plataformas Windows y Motif, el usuario trae un men desplegable pulsando el
botn derecho del ratn mientras el cursor est sobre el componente adecuado. El oyente de
mouse trae un men desplegable llamando a setVisible(true) sobre el ejemplar
apropiado de JPopupMenu.
El siguiente fragmento de cdigo, muestra cmo crear y mostrar mens desplegables:
...//where instance variables are declared:
JPopupMenu popup;
...//where the GUI is constructed:
//Create the popup menu.
popup = new JPopupMenu();
menuItem = new JMenuItem("A popup menu item");
menuItem.addActionListener(this);
popup.add(menuItem);
menuItem = new JMenuItem("Another popup menu item");
menuItem.addActionListener(this);
popup.add(menuItem);
//Add listener to components that can bring up popup menus.
MouseListener popupListener = new PopupListener();
output.addMouseListener(popupListener);
menuBar.addMouseListener(popupListener);
...
class PopupListener extends MouseAdapter {
public void mousePressed(MouseEvent e) {
maybeShowPopup(e);
}
public void mouseReleased(MouseEvent e) {
maybeShowPopup(e);
}
private void maybeShowPopup(MouseEvent e) {
if (e.isPopupTrigger()) {
popup.show(e.getComponent(),
e.getX(), e.getY());
}
}
}
20
Los mens desplegables tienen unos pocos detalles interesantes de implementacin. Uno es que
cada men tiene un men desplegable apropiado. Cuando el men se activa, utiliza su men
desplegable para mostrar sus tems de men.
Otro detalle es que un propio men desplegable utiliza otro componente para implementar
la ventana que contiene los tems del men. Dependiendo de las circunstancias bajo las que se
muestre el men desplegable, podra implementar su "ventana" utilizando un componente de
peso ligero (como un JPanel), un componente de peso medio (como un Panel), o una
ventana de peso pesado (Window).
Las ventanas desplegables de peso ligero son ms eficientes que las ventanas de peso
pesado, pero no funcionan bien si tenemos componentes pesados dentro de nuestro GUI.
Especficamente, cuando un rea de una ventana desplegable de peso ligero se intersecciona con
un componente de peso pesado, el componente de peso pesado se dibuja encima. Esta es una de
las razones por la que se recomienda no mezclar componentes de peso ligero y de peso pesado.
Si realmente se necesita utilizar un componente de peso pesado en el GUI, se puede utilizar el
mtodo setLightWeightPopupEnabled de JPopupMenu para desactivar las ventanas
desplegables de peso ligero.
10.2.5
Como los mens se hacen con componentes ordinarios Swing, se pueden personalizar
fcilmente. Por ejemplo, se puede aadir cualquier componente de peso ligero a un JMenu o
JMenuBar. Y como JMenuBar utiliza BoxLayout, se puede personalizar la distribucin de
la barra de men aadindole componentes invisibles. Aqu mostramos un ejemplo que aade
un componente glue a una barra de men, para que el ltimo elemento del men se site en el
lado derecho de la barra de men:
...//create and add some menus...
menuBar.add(Box.createHorizontalGlue());
...//create the LEFTmost menu...
menuBar.add(LEFTMenu);
En la figura 9 podemos ver una imagen del resultado.
21
10.2.6
El API de JMenu
Las siguientes tablas listan los mtodos y constructores ms utilizados de Jmenu. El API
se divide en estas categoras:
-
Mtodo
Propsito
JMenuBar()
void setJMenuBar(JMenuBar)
JMenuBar getJMenuBar()
(en JApplet,
JRootPane)
JDialog,
JFrame,
void setMenuBar(JMenuBar)
JMenuBar getMenuBar()
(en JInternalFrame)
Mtodo
Propsito
JMenu()
Crea un men.
JMenuItem add(JMenuItem)
JMenuItem add(Action)
void add(String)
void addSeparator()
void remove(JMenuItem)
void remove(int)
void removeAll()
22
Mtodo
JPopupMenu()
JPopupMenu(String)
JMenuItem add(JMenuItem)
JMenuItem add(Action)
Propsito
Crea un men desplegable. El argumento
string opcional especifica el ttulo que el
aspecto y comportamiento podra mostrar
como parte de la ventana desplegable.
Aade un tem de men al final del men
desplegable.
void addSeparator()
void remove(JMenuItem)
void remove(int)
void removeAll()
static void
setDefaultLightWeightPopupEnabled
(boolean)
Mtodo
Propsito
JMenuItem()
JMenuItem(Icon)
JMenuItem(String)
JMenuItem(String, Icon)
JMenuItem(String, int)
23
JRadioButtonMenuItem()
JRadioButtonMenuItem(Icon)
JRadioButtonMenuItem(String)
JRadioButtonMenuItem(String,
Icon)<
void setState(boolean)
boolean getState()
void setEnabled(boolean)
void setMnemonic(char)
void setActionCommand(String)
Selecciona el nombre de
realizada por el tem de men.
void
addActionListener(ActionListener)
la
accin
void
addItemListener(ItemListener)
La mayora de los mtodos anteriores son heredados desde AbstractButton.
12.
CONCLUSIONES
Swing es un API que ofrece JFC 1.1, y representa la nueva generacin de AWT. Swing ampla
AWT proporcionando muchos ms tipos de componentes GUI, ofreciendo implementaciones
cien por cien Java puro a estos componentes y permitiendo adaptar fcilmente el aspecto y
comportamiento de tales componentes, facilitando as el trabajo de los programadores.
El que los componentes de Swing sean cien por cien Java puro implica que no dependen de
ninguna implementacin nativa de ventanas que les de soporte, y que adems estn disponibles
y sean consecuentes en todo tipo de plataforma.
24
25
13.
-
26
BIBLIOGRAFA
http://www.programacion.com/java/tutorial/swing/
Manual - Programacin - Java tutor Swing
http://jungla.dit.upm.es/~santiago/docencia/apuntes/Swing/
Java 1.2 Al descubierto. Jaime Jaworski
Suns Java Swing Tutorial
Java Swing Tutorial (2005)
Lenguaje de programacin Java