Program Ac i on Swing

26
  Programación Orientada a Objetos Junio, 2005 Programación con Swing Noelia Méndez Fernández Jose Luis García Valiente Departamento de Informática y Automática Universidad de Salamanca

description

sssss

Transcript of Program Ac i on Swing

  • Programacin Orientada a Objetos

    Junio, 2005

    Programacin con Swing

    Noelia Mndez Fernndez Jose Luis Garca Valiente

    Departamento de Informtica y Automtica Universidad de Salamanca

  • Jose Luis Garca y Noelia Mndez

    2

    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.

  • Programacin con Swing

    3

    LISTA DE CONTENIDOS

    - Introduccin al trabajo ................................................................................................. Pg. 6 - Introduccin a Swing .................................................................................................. Pg. 6 - Introduccin a las interfaces de usuario y el AWT ...................................................... Pg. 6 - Swing, el AWT y las JFC............................................................................................. Pg. 7 - La jerarqua de componentes Swing ............................................................................ Pg. 8 - Panormica del paquete Swing .................................................................................... Pg. 8 - Construccin de GUI en Swing .................................................................................. Pg. 10 - Manejo de eventos en Swing ...................................................................................... Pg. 12 - Applets en Swing ........................................................................................................ Pg. 13 - Conversin a Swing .................................................................................................... Pg. 13 - Ejemplos ..................................................................................................................... Pg. 14 - Conclusiones ............................................................................................................... Pg. 24 - Bibliografa ................................................................................................................. Pg. 26

  • Jose Luis Garca y Noelia Mndez

    4

    LISTA DE FIGURAS

    - Figura 1: Swing, IFC, JFC y AWT .............................................................................. Pg. 7 - Figura 2: Jerarqua de componentes Swing ................................................................. Pg. 9 - Figura 3: Ejemplos de eventos .................................................................................... Pg. 12 - Figura 4: Relacin entre eventos y oyentes................................................................. Pg. 13 - Figura 5: Ejemplo de ventana con pestaas ................................................................ Pg. 15 - Figura 6: Componentes de mens............................................................................... Pg. 17 - Figura 7: rbol de herencia de las clases relacionadas con mens............................. Pg. 17 - Figura 8: Deteccin de eventos................................................................................... Pg. 19 - Figura 9: Men personalizado..................................................................................... Pg. 22 - Figura 10: Otra distribucin de un men .................................................................... Pg. 22

  • Programacin con Swing

    5

    LISTA DE TABLAS

    - Tabla 1: Crear y configurar un TabbedPane ............................................................... Pg. 15 - Tabla 2: Insertar, Eliminar, Encontrar y Seleccionar Pestaas ................................... Pg. 16 - Tabla 3: Cambiar la Apariencia de las Pestaas ......................................................... Pg. 16 - Tabla 4: Crear y configurar barras de mens .............................................................. Pg. 22 - Tabla 5: Crear y Rellenar Mens ................................................................................ Pg. 22 - Tabla 6: Crear y Rellenar Mens Desplegables.......................................................... Pg. 23 - Tabla 7: Implementar tems de Men ......................................................................... Pg. 23

  • Jose Luis Garca y Noelia Mndez

    6

    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. INTRODUCCIN A LAS INTERFACES DE USUARIO Y EL AWT 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.

  • Programacin con Swing

    7

    Al nivel ms bajo, el sistema operativo transmite informacin desde el ratn y el teclado como dispositivos de entrada al programa. El AWT fue diseado pensando en que el programador no tuviese que preocuparse de detalles como controlar el movimiento del ratn o leer el teclado, ni tampoco atender a detalles como la escritura en pantalla. El AWT constituye una librera de clases orientada a objeto para cubrir estos recursos y servicios de bajo nivel. Debido a que el lenguaje de programacin Java es independiente de la plataforma en que se ejecuten sus aplicaciones, el AWT tambin es independiente de la plataforma en que se ejecute. El AWT proporciona un conjunto de herramientas para la construccin de interfaces grficas que tienen una apariencia y se comportan de forma semejante en todas las plataformas en que se ejecute. Los elementos de interfaz proporcionados por el AWT estn implementados utilizando toolkits nativos de las plataformas, preservando una apariencia semejante a todas las aplicaciones que se creen para esa plataforma. Este es un punto fuerte del AWT, pero tambin tiene la desventaja de que un interfaz grfico diseado para una plataforma, puede no visualizarse correctamente en otra diferente. Estas carencias del AWT son subsanadas en parte por Swing, y en general por las JFC.

    4. SWING, EL AWT Y LAS JFC

    Figura 1 Swing, IFC, JFC y AWT

    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-

    JFC

    AWT

    SwingIFC

  • Jose Luis Garca y Noelia Mndez

    8

    current/comp_gal.html, muestra algunos de ellos. Swing tambin incorpora un programa de demostracin llamado SwingSet.

    Swing tambin ofrece una implementacin de Java puro de muchos de los componentes tradicionales del AWT. Estos componentes tienen la misma funcionalidad que los componentes del AWT y todas las ventajas de Swing. Swing es compatible con el AWT, y los componentes Swing se pueden utilizar con los componentes del AWT. Sin embargo, los compenentes Swing slo se pueden usar con el modelo de eventos del JDK 1.1. No admiten el modelo de eventos del JDK 1.0.

    La arquitectura PL&F de Swing facilita la personalizacin de tanto del aspecto como del comportamiento de cualquier control Swing o de cualquier grupo de estos controles. Swing tambin incorpora varios L&F predefinidos, entre los que reincluye el Metal L&F predeterminado, el Motif L&F y el Windows L&F. Los L&F para Macintosh y otras plataformas tambin se estn desarrollando.

    5. LA JERARQUA DE COMPONENTES SWING Swing consta de nueve paquetes y cientos de clases e interfaces. No obstante, la clase JComponent de java.awt.swing es la clase superior de la jerarqua de componentes Swing. La clase JComponent es una subclase de la clase java.awt.container y, por tanto, es a la vez un componente y un contenedor en el sentido del AWT. Dado que JComponent es la superclase de todos los componentes Swing, todos ellos descienden de java.awt.Container y java.awt.Component.

    La Figura 2 muestra la jerarqua de componentes Swing. La primera cosa que se debe tener en cuenta es que todos los componentes empiezan por la letra J, seguida por el tipo de componente que admite la clase. Jcomponent consta de las subclases directas que se muestran en la Figura 2.

    6. PANORMICA DEL PAQUETE SWING 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).

  • Programacin con Swing

    9

    El paquete java.awt.swing.tree ofrece clases e interfaces que admiten el uso del componente JTree.

    El paquete java.awt.swing.undo admite operaciones hacer y rehacer.

    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

    Figura 2. La jerarqua de componentes Swing

  • Jose Luis Garca y Noelia Mndez

    10

    7. CONSTRUCCIN DE GUI EN SWING La construccin de una GUI en Swing es muy similar a la construccin de GUI en el AWT, exceptuando que la primera tendr muchas ms clases de componentes con las que trabajar. A continuacin se describen las clases que se usan para la construccin de GUI y se sealan las mejoras que Swing proporciona, comparando stas clases con las de AWT.

    - Ventanas

    Swing, al igual que AWT, proporciona una jerarqua de clases Window. Las clases de la ventana de Swing constituyen extensiones de la jerarqua de clases Window del AWT. La clase JWindow ampla la clase Window. La clase JFrame ampla la clase JFrame del AWT y la clase JDialog ampla la clase Dialog del AWT.

    Las clases JWindow, JFrame y JDialog difieren de sus homlogos del AWT en que utilizan un panel de contenido separado para agregar y disear componentes GUI. Este panel es un objeto Container al que se accede a travs del mtodo getContentPane(). El panel de contenido es una parte de un objeto JRootPane que contiene otros paneles que se usan para sobreponerse a componentes e interceptar eventos del ratn y del teclado.

    - Mens

    Los mens de Swing, al igual que las ventanas de Swing, son anlogos a sus homlogos del AWT. Las clases JMenuBar, JMenu, JMenuItem, JCheckBoxMenuItem y JRadioButtonMenuItem se utilizan de la misma forma que las clases MenuBar, Menu, MenuItem y CheckboxMenuItem del AWT, slo que con una diferencia fundamental. Las clases de mens de Swing son todas ellas subclases de la clase JComponent y, por tanto, de la clase Component. Esto implica que los mens de Swing, al contrario que sus homlogos del AWT, constituyen componentes de primera clase y se pueden usar con cualquiera de las clases Container. La clase JPopupMenu es equivalente a la clase PopupMenu del AWT. Otra atractiva caracterstica de los mens de Swing es la posibilidad de utilizar imgenes de iconos en los mens. Se puede aadir una imagen a un elemento de men por medio de su constructor.

    - Paneles

    La clase JPanel es el equivalente de Swing a la clase Panel del AWT. Esta clase, al igual que sucede en otras clases de JComponent, ofrece la posibilidad de agregar un borde.

    - Diseos

    Los contenedores de Swing admiten todos los diseos posibles del AWT, entre los que se incluye el diseo null, adems de admitir otros diseos nuevos.

    - Iconos

    Una de las caractersticas ms tiles que Swing ofrece es la posibilidad de agregar iconos a los componentes, como etiquetas, botones, elementos de men, etc. La interfaz Icon define los mtodos que las clases de iconos deben implementar. La clase ImageIcon proporciona una implementacin predeterminada de esta interfaz. Los objetos ImageIcon se pueden construir a partir de archivos de imagen, URL que apuntan a archivos de imagen u objetos Image del AWT.

    - Bordes

    El paquete java.awt.swing.border proporciona la interfaz Border, la cual define los mtodos que necesitan ser implementados por todas las clases de bordes. La clase

  • Programacin con Swing

    11

    AbstractBorder implementa la interfaz Border y es la superclase de las clases de bordes de Swing.

    - Informacin sobre herramientas

    La clase JToolTip ofrece la posibilidad de agregar cuadros de texto emergentes que aparecen cuando se posa el ratn sobre un componente. Estos componentes, que admiten informacin sobre herramientas, permiten que stas vengan especificadas en sus respectivos constructores. El mtodo setToolTipText() de la clase JComponent se puede usar tambin para especificar la informacin sobre herramientas de un componente.

    - Barras de herramientas

    La clase JToolBar ofrece la posibilidad de utilizar barras de herramientas movibles y acoplables con Swing. Los objetos de esta clase son contenedores de otros componentes Swing o del AWT. Los objetos JToolBar tpicos contienen objetos JButton que se construyen por medio de iconos de imagen.

    - Etiquetas y botones

    Las clases JLabel y JButton proporcionan los equivalentes de Swing a las clases Label y Button del AWT. La implementacin de Swing ofrece la ventaja de poder usar iconos a la vez que texto. Los constructores JLabel() y JButton() permiten que se especifique un icono. Adems, ambas clases admiten el mtodo setIcon() para establecer un icono una vez que se ha construido el objeto.

    - Componentes de texto

    Las clases JTextComponent, JTextField y JTextArea son los equivalentes de Swing de las clases TextCompoenent, TextField y TextArea del AWT. Adems, Swing proporciona la clase TextPane para trabajar con documentos de texto, que se pueden marcar con estilos de texto diferentes.

    - Listas y cuadros combinados

    Las clases JComboBox y JList ofrecen la posibilidad de presentarle al usuario una lista de selecciones grficas de texto. La clase JComboBox implementa una lista desplegable, parecida a una lista de opciones Motif. La clase JList es una lista de selecciones individuales o mltiples en las que se pueden ver muchos elementos.

    - Deslizadores y barras de progreso

    Las clases JSlider y JProgressBar carecen de equivalentes en el AWT. Ambas clases admiten orientaciones horizontales y verticales. La clase JProgressBar se utiliza tpicamente para mostrar el progreso de una tarea, como la carga de una imagen. La clase JSlider se usa para ajustar o controlar el valor de una variable dentro del intervalo admisible.

    - Barras de desplazamiento

    El JScrollPane simplifica en gran medida el uso de las barras de desplazamiento. El mtodo getViewport() devuelve un objeto JViewport en el que se pueden ir aadiendo componentes. En la mayora de los casos, slo necesita agregar componentes al objeto JViewport para que uno se pueda desplazar automticamente por ellos.

    - Tablas

    La clase JTable es otro componente de Swing que carece de equivalente en AWT. JTable ofrece una posibilidad muy flexible para crear y mostrar tablas. Permite construir tablas a partir de arrays o vectores de objetos, o bien a partir de objetos que implementan la interfaz TableModel.

  • Jose Luis Garca y Noelia Mndez

    12

    La interfaz JTableModel define mtodos para los objetos que especifican el contenido de una tabla. La clase AbstractTableModel ofrece una implementacin predeterminada de la interfaz JTableModel. Esta clase se ampla tpicamente para proporcionar una implementacin personalizada de modelo de tabla.

    La clase JTable ofrece la posibilidad de editar tablas. El mtodo setCellEditor() permite que un objeto de la interfaz TableCellEditor sea identificado como el editor de celdas de una tabla.

    - rboles

    Una de las clases nuevas ms interesantes que ofrece Swing es la clase JTree. Esta clase implementa una estructura en forma de rbol que se puede usar para mostrar datos jerrquicos. La interfaz TreeNode define mtodos que tienen que implementar los nodos de un objeto JTree. La clase DefaulMutableTreeNode proporciona una implementacin predeterminada de la interfaz TreeNode. Los rboles se crean construyendo objetos de la interfaz TreeNode para luego aadirlos todos juntos (a travs del mtodo add()). Cuando todos los objetos TreeNode se hayan juntado, el objeto TreeNode resultante se pasa al constructor JTree.

    La presentacin predeterminada de un objeto JTree utiliza un icono de carpeta con el fin de identificar los nodos de rbol que tienen nodos inferiores y un icono de archivo para identificar las ramificaciones del rbol. El mtodo setCellRenderer() de la clase JTree se usa para identificar una prestacin de rbol alternativa.

    8. MANEJO DE EVENTOS EN SWING 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:

    Figura 3 Ejemplos de eventos

    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

  • Programacin con Swing

    13

    de evento puede tener varios oyentes registrados. Inversamente, un slo oyente puede registrarse con varias fuentes de eventos.

    Figura 4 Relacin entre eventos y oyentes

    9. APPLETS DE SWING La clase JApplet es el equivalente de Swing de la clase Applet. JApllet se parece a JFrame en que admite un panel de contenido separado. A este contenedor se accede a travs del mtodo getContentPane(). La barra de mens debe ser un objeto de la clase JMenuBar.

    10. CONVERSIN A SWING 9.1 Por qu convertir a Swing?

    Ante la pregunta, por qu debo convertir a Swing?, la razn ms fuerte es que Swing ofrece muchos beneficios a los programadores y usuarios finales. Entre ellos:

    - El rico conjunto de componentes listo-para-usar significa que podemos aadir caractersticas divertidas a nuestros programas -- botones con imgenes, barras de herramientas, paneles con pestaas, display HTML, imgenes en tems de men, un selector de color, etc.

    - Tambin significa que podramos reemplazar algunos componentes personalizados con componentes Swing ms extensibles y eficaces.

    - Tener modelos separados de datos y estados hace que los componentes Swing sean altamente personalizables y permite compartir datos entres componentes.

    - La arquitectura conectable del aspecto y comportamiento swing ofrece una amplia seleccin de aspectos y comportamientos. Junto al aspecto y comportamiento de la plataforma usual, podemos usar el aspecto y comportamiento Java e incluso aspectos y comportamientos de terceras partes.

    - Los componentes Swing tienen soporte interno para accesibilidad, lo que hace que nuestros programas pueden usarse automticamente con tecnologas asistivas.

    - Los componentes Swing continuarn amplindose en el futuro.

    - 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.

    9.2 Cmo convertir a Swing?

  • Jose Luis Garca y Noelia Mndez

    14

    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.

    10.1 Cmo utilizar la Clase Tabbed Pane 10.1.1 Qu es la clase Tabbed Pane?

    Con la clase JTabbedPane, podemos tener varios componentes (normalmente objetos JPanel) compartiendo el mismo espacio. El usuario puede elegir qu componente ver seleccionando la pestaa del componente deseado.

    10.1.2 Construir una aplicacin con un Tabbed Pane Para crear un TabbedPane, simplemente se ejemplariza un JTabbedPane, se crean los componentes que deseemos mostrar, y luego los aadimos al TabbedPane utilizando el mtodo addTab.

    Compilando y ejecutando el siguiente cdigo, se obtiene como resultado la ventana que aparece representada en la Figura 5.

    ImageIcon icon = new ImageIcon("images/middle.gif");

    JTabbedPane tabbedPane = new JTabbedPane();

    Component panel1 = makeTextPanel("Blah");

    tabbedPane.addTab("One", icon, panel1, "Does nothing");

    tabbedPane.setSelectedIndex(0);

    Component panel2 = makeTextPanel("Blah blah");

    tabbedPane.addTab("Two", icon, panel2, "Does twice as much nothing");

    Component panel3 = makeTextPanel("Blah blah blah");

    tabbedPane.addTab("Three", icon, panel3, "Still does nothing");

    Component panel4 = makeTextPanel("Blah blah blah blah");

    tabbedPane.addTab("Four", icon, panel4, "Does nothing at all");

  • Programacin con Swing

    15

    Figura 5 Ejemplo de ventana con pestaas

    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 Las siguientes tablas listan los mtodos y constructores ms utilizados de TabbedPane. El API para utilizar TabbedPane se divide en estas categoras:

    - Crear y configurar un TabbedPane.

    - Insertar, Eliminar, Encontrar y Seleccionar Pestaas.

    - Cambiar la apariencia de las pestaas.

    Tabla 1 Crear y configurar un TabbedPane

    Mtodo Propsito

    JTabbedPane()

    JTabbedPane(int)

    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.

    addTab(String, Icon, Component, String)

    addTab(String, Icon, Component)

    addTab(String, Component)

    Aade una nueva pestaa al TabbedPane. El primer argumento especifica el texto de la pestaa.

    El argumento Icon es opcional e indica el icono de la pestaa. El argumento Component especifica el componente que el TabbedPane debera mostrar cuando se selecciona la pestaa. El cuarto argumento, si existe, especifica el texto del tooltip para la pestaa.

  • Jose Luis Garca y Noelia Mndez

    16

    Tabla 2 Insertar, Eliminar, Encontrar y Seleccionar Pestaas

    Mtodo Propsito

    insertTab(String, Icon, Component, String, int)

    Inserta una pestaa en el ndice especificado, donde la primera pestaa tiene ndice 0. Los argumentos son los mismos que para addTab.

    remove(Component)

    removeTabAt(int)

    Elimina la pestaa correspondiente al ndice o componente especificado.

    removeAll() Elimina todas las pestaas.

    int indexOfComponent(Component)

    int indexOfTab(String)

    int indexOfTab(Icon)

    Devuelve el ndice de la pestaa que tiene el componente, ttulo o icono especificados.

    void setSelectedIndex(int)

    void setSelectedComponent(Component)

    Selecciona la pestaa que tiene el ndice o componente especificado.

    Seleccionar una pestaa tiene el efecto de mostrar su componente asociado.

    int getSelectedIndex()

    Component getSelectedComponent()

    Devuelve el ndice o componente de la pestaa seleccionada.

    Tabla 3 Cambiar la Apariencia de las Pestaas

    Mtodo Propsito

    void setComponentAt(int, Component)

    Component getComponentA(int)

    Selecciona u obtiene qu componente est asociado con la pestaa del ndice especificado. La primera pestaa tiene ndice 0.

    void setTitleAt(int, String)

    String getTitleAt(int)

    Selecciona u obtiene el ttulo de la pestaa del ndice especificado.

    void setIconAt(int, Icon)

    Icon getIconAt(int)

    void setDisabledIconAt(int, Icon)

    Icon getDisabledIconAt(int)

    Selecciona u obtiene iconos mostrados pestaa del ndice especificado.

    void setBackgroundAt(int, Color)

    Color getBackgroundAt(int)

    void setForegroundAt(int, Color)

    Color getForegroundAt(int)

    Selecciona u obtiene el color de fondo o de primer plano usado por la pestaa del ndice especificado. Por defecto, una pestaa utiliza los colores del TabbedPane.

    Por ejemplo, si el color de primer plano del TabbedPane es negro, entonces todos los ttulos de las pestaas sern en negro, excepto para aquellas en que especifiquemos otro color usando setForegroundAt.

  • Programacin con Swing

    17

    void setEnabledAt(int, boolean)

    boolean isEnabledAt(int)

    Selecciona u obtiene el estado activado de la pestaa del ndice especificado.

    10.2 Cmo Utilizar Mens 10.2.1 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.

    Figura 6 Componentes de un men

    10.2.2 La herencia de componentes de men

    Figura 7 rbol de herencia de las clases relacionadas con mens.

  • Jose Luis Garca y Noelia Mndez

    18

    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 Construir una aplicacin con un Men 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.

    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 Manejar Eventos desde tems de Mens 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.

    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);

  • Programacin con Swing

    19

    Figura 8 Deteccin de eventos

    A continuacin se muestra un fragmento de cdigo que implementa el manejo de eventos:

    Para traer un men desplegable (JPopupMenu), debemos registrar un oyente de ratn

    para cada componente al que debera estar asociado el men desplegable. El oyente de mouse debe detectar las peticiones del usuario para que aparezca el men desplegable.

    public class MenuDemo ... implements ActionListener, ItemListener {

    ...

    public MenuDemo() {

    ...//for each JMenuItem instance:

    menuItem.addActionListener(this);

    ...//for each JRadioButtonMenuItem:

    rbMenuItem.addActionListener(this);

    ...//for each JCheckBoxMenuItem:

    cbMenuItem.addItemListener(this);

    ...

    }

    public void actionPerformed(ActionEvent e) {

    ...//Get information from the action event...

    ...//Display it in the text area...

    }

    public void itemStateChanged(ItemEvent e) {

    ...//Get information from the item event...

    ...//Display it in the text area...

    }

  • Jose Luis Garca y Noelia Mndez

    20

    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());

    }

    }

    }

  • Programacin con Swing

    21

    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 Personalizar la Distribucin de un Men 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:

    En la figura 9 podemos ver una imagen del resultado.

    Figura 9 Men personalizado

    Otra forma de cambiar el aspecto de un men es cambiar el controlador de distribucin que lo controla. Por ejemplo, se puede cambiar el controlador de distribucin de la barra de men del valor por defecto BoxLayout de izquierda-derecha, a algo como un GridLayout.

    Tambin podemos cambiar como un men activado u otro men desplegable distribuye sus tems. En la figura 10 se muestra una imagen de una aplicacin en la que se ha modificado la distribucin del men.

    Figura 10 Otra distribucin de un men

    ...//create and add some menus...

    menuBar.add(Box.createHorizontalGlue());

    ...//create the LEFTmost menu...

    menuBar.add(LEFTMenu);

  • Jose Luis Garca y Noelia Mndez

    22

    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:

    - Crear y Configurar Barras de Men.

    - Crear y Rellenar Mens.

    - Crear, Rellenar y Controlar Mens Desplegables.

    - Implementar tems de Men.

    Tabla 4 Crear y configurar barras de mens

    Mtodo Propsito

    JMenuBar() Crea una barra de men.

    void setJMenuBar(JMenuBar)

    JMenuBar getJMenuBar()

    (en JApplet, JDialog, JFrame, JRootPane)

    Selecciona u obtiene la barra de men de un applet, dialog, frame, o root pane.

    En las siguientes versiones de Swing y del JDK 1.2, los frames internos tambin soportarn estos mtodos.

    void setMenuBar(JMenuBar)

    JMenuBar getMenuBar()

    (en JInternalFrame)

    Selecciona u obtiene la barra de men de un Frame interno. En las siguientes versiones de Swing y del JDK 1.2, este mtodo ser anulado y deberamos utilizar setJMenuBar/getJMenuBar.

    Tabla 5 Crear y Rellenar Mens

    Mtodo Propsito

    JMenu() Crea un men.

    JMenuItem add(JMenuItem)

    JMenuItem add(Action)

    void add(String)

    Aade un tem de men al final del men.

    Si el argumento es un string, el men crea automticamente un objeto JMenuItem que muestra el texto especificado.

    void addSeparator() Aade un separador la final del men.

    >JMenuItem insert(JMenuItem, int)

    JMenuItem insert(Action, int)

    void insert(String, int)

    void insertSeparator(int)

    Inserta un tem de men o un separador en un men, en la posicin especificada. El primer tem de men es la posicin 0, el segundo la posicin 1, etc. Los argumentos JMenuItem, Action, y String se tratan de la misma forma que en los correspondientes mtodos add.

    void remove(JMenuItem)

    void remove(int)

    void removeAll()

    Elimina el tem o tems especificados del men. Si el argumento es un entero, especifica la posicin del tem a eliminar.

  • Programacin con Swing

    23

    Tabla 6 Crear y Rellenar Mens Desplegables

    Mtodo Propsito JPopupMenu()

    JPopupMenu(String)

    Crea un men desplegable. El argumento string opcional especifica el ttulo que el aspecto y comportamiento podra mostrar como parte de la ventana desplegable.

    JMenuItem add(JMenuItem)

    JMenuItem add(Action)

    Aade un tem de men al final del men desplegable.

    void addSeparator() Aade un separador al final del men desplegable.

    void insert(Component, int)

    JMenuItem insert(Action, int)

    Inserta un tem de men en la posicin especificada. El primer tem del men est en la posicin 0, el segundo en la posicin 1, etc. El argumento Component especfica el tem de men a aadir. El argumento Action es tratado de la misma forma que en el mtodo add correspondiente.

    void remove(JMenuItem)

    void remove(int)

    void removeAll()

    Elimina el tem o tems especificados del men.

    Si el argumento es un entero, especifica la posicin del elemento del men a eliminar.

    static void

    setDefaultLightWeightPopupEnabled(boolean)

    Por defecto, Swing implementa una ventana de men utilizando un componente de peso ligero.

    Esto causa problemas su utilizamos componentes de peso pesado en nuestro programa Swing. Para evitar estos problemas, se puede llamar a JPopupMenu.setDefaultLightWeightPopupEnabled(false).

    void show(Component, int, int)

    Muestra el men desplegable en la posicin X,Y (especificada en el orden de los argumentos enteros) en el sistema de coordenadas del componente especificado.

    Tabla 7 Implementar tems de Men

    Mtodo Propsito JMenuItem()

    JMenuItem(Icon)

    JMenuItem(String)

    JMenuItem(String, Icon)

    JMenuItem(String, int)

    Crea un tem de men normal. El argumento icon, si existe, especifica el icono que debera mostrar el tem de men. Igualmente el argumento String, especifica el texto que debera mostrar el tem de men. El argumento entero especifica el mnemnico de teclado a utilizar.

    Se puede especificar una de las

  • Jose Luis Garca y Noelia Mndez

    24

    constantes VK definidas en la clase KeyEvent. Por ejemplo, para especificar "a" como el mnemnico, podemos utilizar KeyEvent.VK_A.

    JCheckBoxMenuItem()

    JCheckBoxMenuItem(Icon)

    JCheckBoxMenuItem(String)

    JCheckBoxMenuItem(String, Icon)

    JCheckBoxMenuItem(String, boolean)

    JCheckBoxMenuItem(String, Icon, boolean)

    Crea un tem de men que se parece y acta como un checkbox. Si se especifica un icono, el tem de men utiliza el icono en vez del icono por defecto de los checkboxes. El argumento string, si existe, especifica el texto que debera mostrar el tem de men. Si se especifica true para el argumento booleano, el tem de men estar inicialmente seleccionado. De lo contrario el tem de men est desactivado.

    JRadioButtonMenuItem()

    JRadioButtonMenuItem(Icon)

    JRadioButtonMenuItem(String)

    JRadioButtonMenuItem(String, Icon)<

    Crea un tem de men que se parece y acta como un radio buttom. Si se especifica un icono, el tem de men utiliza el icono en vez del icono por defecto de los botones de radio. El argumento string, si existe, especifica el texto que debera mostrar el tem de men. El tem de men est inicialmente desactivado.

    void setState(boolean)

    boolean getState()

    Selecciona u obtiene el estado de seleccin de un tem de men.

    void setEnabled(boolean)

    Si el argumento es true, activa el tem de men, si es false lo desactiva.

    void setMnemonic(char) Selecciona la tecla alternativa para seleccionar el tem de men sin el ratn.

    void setActionCommand(String) Selecciona el nombre de la accin realizada por el tem de men.

    void addActionListener(ActionListener)

    void addItemListener(ItemListener)

    Aade un oyente de eventos al tem de men.

    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.

  • Programacin con Swing

    25

    Transformar programas de AWT a Swing es muy sencillo, y gracias a todos los componentes que ofrece, presenta gran cantidad de ventajas, por lo que es recomendable utilizar ste API.

  • Jose Luis Garca y Noelia Mndez

    26

    13. 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