Curso de Swing
-
Upload
jorge-guillo -
Category
Documents
-
view
51.838 -
download
10
description
Transcript of Curso de Swing
Swing
Jorge Guilló – [email protected]
Contenido Introducción
AWT Swing Primer programa Swing
Arquitectura básica JFrame JComponent Layouts Eventos
Controles básicos Etiquetas e Iconos Cajas de texto Botones Barras de desplazamiento Barras de progreso Listas
Contenedores Applets MDI Diálogos
JOptionPane JFileChooser / JColorChooser
Menús y Barras de herramientas
Acciones Tablas Árboles Drag & Drop Gráficos 2D Impresión
Introducción a Swing
Origen y arquitectura
AWT AWT (Abstract Windowing Toolkit) es la
primera librería de ventanas de Java AWT (Java 1.0) - 1994
Mínimo común denominador de controles que existen en todos los sistemas
Sólo cuatro fuentes Todos los eventos se lanzan aunque no sean
necesarios (bucle de eventos) AWT (Java 1.1) - 1997
Se mejora la gestión de eventos Pero es igual de feo
Swing
Apareció en 1998 como librería externa para JDK 1.1
Se incluye en la distribución estándar a partir de JDK 1.2
Parte de las Java Foundation Classes (JFC)
Java Foundation Classes
Java Foundation Classes
AWT AccesibilidadSwingJava 2D
Drag &
Drop
Características de Swing Apariencia conectable (Look&Feel) Componentes ligeros
No dependen de controles nativos Código Java puro
Componentes implementados como JavaBeans Integración con herramientas gráficas
Arquitectura Modelo-Controlador-Vista El control agrupa Controlador y Vista
Problemas: No soportan multithreading Problemas de Z-order con componentes pesados
Primer programa Swing
import javax.swing.*;
public class MiFrame extends JFrame {
public MiFrame() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel lbl = new JLabel("Hola a todos");
this.getContentPane().add(lbl);
this.pack();
}
public static void main(String[] args) {
MiFrame frm = new MiFrame();
frm.setVisible(true);
}
}
import javax.swing.*;
public class MiFrame extends JFrame {
public MiFrame() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel lbl = new JLabel("Hola a todos");
this.getContentPane().add(lbl);
this.pack();
}
public static void main(String[] args) {
MiFrame frm = new MiFrame();
frm.setVisible(true);
}
}
Implementación óptima
...
private static void iniciarGUI() {
MiFrame frm = new MiFrame();
frm.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(
new Runnable() {
public void run() {
iniciarGUI();
}
});
}
...
...
private static void iniciarGUI() {
MiFrame frm = new MiFrame();
frm.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(
new Runnable() {
public void run() {
iniciarGUI();
}
});
}
...
Arquitectura de Swing
Arquitectura de Swing Las ventanas son contenedores de alto nivel
JFrame, JApplet, JDialog, JWindow Existen controles contenedores, que contienen
a su vez a otros controles Los controles se organizan en su contenedor
dependiendo del layout utilizado Los controles tienen los datos en un objeto
separado (modelo) El aspecto final de los controles depende del
gestor de UI, que utiliza un objeto Look&Feel Todo el trabajo con el interfaz gráfico se debe
realizar desde un mismo hilo de ejecución
Modelo-Controlador-Vista En Swing, el componente está separado de los
datos que representa El componente se preocupa de la visualización
Agrupa el controlador y la vista El modelo contiene los datos y el estado del
componente Un mismo componente puede usar varios
modelos para distintos aspectos Ejemplo: en la listas, se utiliza un modelo para los
datos y otro para la selección Normalmente, el componente da acceso
directo a las propiedades más utilizadas del modelo
Look & Feel Se puede cambiar dinámicamente el aspecto y
comportamiento de las ventanas y controles Existen 3 "motivos" básicos
Metal: Propio de Java javax.swing.plaf.metal.MetalLookAndFeel
Motif: Basado en UNIX com.sun.java.swing.plaf.motif.MotifLookAndFeel
Windows: Basado en Windows com.sun.java.swing.plaf.windows.WindowsLookAndFeel
Para establecer la apariencia se usa UIManager UIManager.setLookAndFeel(lnfName)
Hay que actualizar todos los controles SwingUtilities.updateComponentTreeUI(frame)
Thread de eventos Toda la gestión de eventos y pintado de Swing se
realiza desde un único thread Cada evento termina antes de que se inicie el siguiente Los repintados no se interrumpen por los eventos Si un evento dura mucho, la aplicación se "cuelga"
Siempre que se quiera modificar un componente se debe realizar desde el thread de eventos
El método SwingUtilities.invokeLater solicita al thread de eventos que ejecute códigoSwingUtilities.invokeLater(
new Runnable() { public void run() {...} });
Jerarquía de clases Swing
JL ab e l
JL is t
JC o m b o B ox
JS c ro llB a r
JP ro g re ssB ar
JS lid e r
JS p in n er
JT o o lB ar
JM e nu B ar
JP o pu p M e nu
JP a ssw o rd F ie ld
JF o rm a tted T e xtF ie ld
JT e x tF ie ld
JT e xtA rea
JT e xtP a ne
JE d ito rP a ne
JT e xtC om p on e n t
JC h eckB ox
JR a d io B u tton
JT og g le B u tton
JB utton
JM e nu
JR ad io B u tto n M e n uItem
JC h eckB u tto nM e nu Item
JM e nu Item
A b stra ctB u tton JR oo tP a ne
JP a n e l
JS c ro llP a ne
JS p litP a ne
JT ab b ed P a ne
JD e sk to pP a ne
JL aye re d P a ne
J In te rn a lFra m e
JS e pa ra to r
JT o o lT ip
JT a b le
JT re e
JV ie w P o rt
JO ptio n P a ne
JF ile C h o o ser
JC o lo rC h o o ser
JC o m p on e n t
JA pp le t
ja va .a pp le t.A pp le t
ja va .a w t.P a n e l
JW in d ow
JD ia log
ja va .a w t.D ia log
JF ra m e
ja va .a w t.Fra m e
ja va .aw t.W in d ow
ja va .a w t.C o n ta in e r
ja va .a w t.C o m p on e n t
Contenedores de alto nivel Los contenedores de alto nivel son aquellos
que pueden mostrarse de manera independiente, sin pertenecer a otro contenedor
JFrame Ventana con bordes, título, botones de control,...
JWindow Ventana sin bordes ni título (splash)
JApplet Ventana incrustable en un navegador
JDialog Ventana que puede mostrarse modal
Contienen un único control hijo: JRootPane
Estructura de un JFrame
JFrame
JRootPane
JLayeredPaneJPanel
(Glass Pane)
JMenuBarJPanel
(Content Pane)
Controles
Estructura de un JFrame
JFrame
Métodos setDefaultLookAndFeelDecorated
Utiliza el LookAndFeel en el título y los bordes de todas las ventanas que se construyan (método estático)
JFrame.setDefaultLookAndFeelDecorated(true); setDefaultCloseOperation
Acción que se lanza cuando se cierra la ventana frame.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE);
Propiedades rootPane, layeredPane, glassPane, contentPane, jMenuBar
JComponent: Propiedades background border colorModel components cursor enabled font foreground insets layout
locale location locationOnScreen name parent size showing toolTipText valid visible
JComponent: Métodos add(Component) add(Component, index) add(Component, constraints) add(Component, constraints, index)
Añade un componente al contenedor remove(index) remove(Component) removeAll()
Elimina un componente del contenedor pack()
Cambia el tamaño de una ventana para ajustarla al tamaño de sus componentes
invalidate() Marca el control como inválido (necesita repintado). Normalmente es
automático revalidate()
Produce el repintado de un contenedor. Se usa sobre todo al añadir controles.
Layouts AWT y Swing
Los controles obtienen su posición y tamaño de acuerdo al gestor de disposición (layout manager) que utilice su contenedor
FlowLayout BorderLayout CardLayout GridLayout GridBagLayout BoxLayout SpringLayout Null
FlowLayout
Los controles se disponen de izquierda a derecha como en un procesador de textos Si no caben, ocupan varias líneas
Parámetros del constructor: align: Alineación de los controles
LEFT, RIGHT, CENTER hgap: Separación entre los controles de
una línea vgap: Separación entre líneas
BorderLayout Los controles se alinean a los bordes de la ventana,
ocupando todo el espacio libre
Parámetros del constructor: hgap, vgap: Separación horizontal / vertical entre los controles
Parámetro de add(): Alineación del control BorderLayout.NORTH / BorderLayout.PAGE_START BorderLayout.SOUTH / BorderLayout.PAGE_END BorderLayout.WEST / BorderLayout.LINE_START BorderLayout.EAST / BorderLayout.LINE_END BorderLayout.CENTER
CardLayout Los controles se muestran uno cada vez, como páginas
Normalmente, se añaden como páginas paneles con varios controles
Parámetros del constructor: hgap / vgap: Márgen horizontal y vertical para los controles
página Parámetro de add(): nombre de la página Métodos:
first(Container), previous(Container), next(Container), last(Container): Navegación entre las páginas del contenedor
show (Container, name): Muestra la página del contenedor que tiene el nombre indicado
GridLayout Alinea los controles en forma de tabla
Parámetros del constructor: rows, columns: Nº de filas / columnas
Si se indica 0, no hay límite (tantas como controles se añadan)
hgap, vgap: Separación horizontal y vertical entre los controles
GridBagLayout Proporciona gran control de la posición de los
controles dentro del contenedor Los controles se colocan en una grid, con distintos
parámetros (restricciones)
Parámetro de add(): restricciones del control (objeto GridBagConstraints)
GridBagConstraints gridX, gridY: Celda en la que se coloca el control
RELATIVE: Se coloca como siguiente control al anterior gridwidth, gridheight: Nº de filas / columnas que ocupa el
control RELATIVE: Ocupa todas las celdas que quedan menos la última REMAINDER: Ocupa todas las celdas que quedan
anchor: Posición del control dentro de la celda NORTH, SOUTH, EAST, WEST, CENTER, NORTHEAST,...
fill: Indica si el control ocupa todo el espacio libre de la celda NONE, VERTICAL, HORIZONTAL, BOTH
insets: Margen externo ipadX, ipadY: Relleno interno weightX, weightY: Indica como se reparte el espacio libre
entre los controles de la fila / columna. Los componentes con mayor peso reciben más espacio
BoxLayout Los controles se alinean a lo largo de un eje,
permitiendo configurar las separaciones entre ellos El contenedor Box lo utiliza por defecto
Parámetro del constructor: axis: Indica si la caja es horizontal (X_AXIS) o vertical
(Y_AXIS) Las separaciones se crean con métodos estáticos de la
clase Box y se añaden como controles al contenedor Strut: Separación de tamaño fijo
Box.createRigidArea(dimension) Box.createHorizontalStrut(size) Box.createVerticalStrut(size)
Glue: Separación de tamaño variable Box.createGlue() Box.createHorizontalGlue() Box.createVerticalGlue()
SpringLayout Forma un grid de componentes y define relaciones
entre los bordes de los distintos controles (o entre los bordes de los controles y los bordes del contenedor)
Las relaciones se añaden con el método putConstraint del layout
Se suele utilizar con diseñadores gráficos
Null Layout
Si no se especifica layout, los controles se colocan utilizando posiciones absolutas Propiedades location y size
Más sencillo para construir ventanas de tamaño fijo
Combinar layouts
Normalmente, una ventana se compone de varios paneles cada uno con el layout más apropiado
Aceptar Cancelar
Opción 1
Opción 2
Opción 3
Opción 4
BorderLayout
FlowLayout
BoxLayout
GridLayout
Practica Layouts
Crear una calculadora
Tamaño, posición y alineación Las siguientes propiedades controlan el
tamaño y la posición de un control location: (Point) Posición del control size: (Dimension) Tamaño del control minimumSize: Tamaño mínimo maximumSize: Tamaño máximo preferredSize: Tamaño preferido bounds: (Rectangle) Posición y tamaño alignmentX / alignmentY: (numero entre 0 y 1)
posición relativa del control dentro del contenedor El efecto de estas propiedades depende del
layout manager
Bordes Se asigna un objeto Border a la propiedad border del
control Se puede utilizar la clase BorderFactory para obtener un
borde de un tipo determinado Tipos de borde:
BevelBorder: Eleva (RAISED) o deprime (LOWERED) el control
CompundBorder: Compuesto de dos bordes (interno y externo)
EmptyBorder: Borde invisible que sólo reserva espacio EtchedBorder: Grabado (LOWERED) o en relieve (RAISED) LineBorder: Línea simple MatteBorder: Borde de color o con imágenes repetidas TitledBorder: Añade un título a otro borde
Modelo de eventos Para cada tipo de evento XXX existe:
Un objeto XXXEvent, que contiene la información que se genera con el evento
Un interfaz XXXListener que se debe implementar para atender el evento (gestor de evento)
Dos métodos addXXXListener y removeXXXListener en los controles que soportan el evento para añadir y quitar gestores de eventos
Ejemplo (para pulsación de botones, menús, etc...):
ActionEvent ActionListener addActionListener removeActionListener
Atender eventos
Para atender un evento se debe implementar el interfaz Listener En una clase externa
El número de clases crece muy rápido En la propia clase ventana
Es complicado distinguir eventos del mismo tipo que provengan de distintos controles
En una clase interna Es la solución más utilizada El código puede resultar complejo Se suelen utilizar clases internas anónimas
Adapters
Algunos interfaces Listener contienen muchos métodos Por ejemplo, el interfaz WindowListener
incluye: windowOpened, windowClosing, windowClosed,
windowIconified, windowDeiconified, windowActivated, windowDeactivated
En estos casos, el JDK incluye una clase XXXAdapter que realiza una implementación por defecto de todos los métodos Sólo se sobrescriben los métodos que
interesa
Clases anónimas
Los gestores de eventos se suelen implementar utilizando clases anónimas
Al añadir el listener, se utiliza la sintaxis: addXXXListener(new XXXListener() { // Cuerpo de la clase anónima});
JFrame ventana = new JFrame( "Prueba de eventos" );
ventana.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent evt ){ System.exit( 0 ); } } );
JFrame ventana = new JFrame( "Prueba de eventos" );
ventana.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent evt ){ System.exit( 0 ); } } );
Acciones Una acción agrupa un procedimiento con sus
propiedades Permite asignar la misma funcionalidad a distintos
controles Si se desactiva la acción, se desactivan los controles
Interfaz Action / clase AbstractAction enabled: Indica si la acción está activa getValue(clave) / putValue(clave, valor): Propiedades de la
acción NAME, DEFAULT, SMALL_ICON, SHORT_DESCRIPTION,
LONG_DESCRIPTION actionPerformed(): Código que se ejecuta al lanzar la
acción Se debe implementar en la clase derivada
Constructor: AbstractAction(texto, icono)
Controles básicos
Etiquetas Objetos JLabel Las etiquetas pueden tener texto y/o icono Propiedades:
text icon / disabledIcon horizontalAlignment / verticalAlignment horizontalTextPosition / verticalTextPosition
iconTextGap labelFor displayedMnemonic / displayedMnemonicIndex
Utilizar HTML
En las propiedades de texto de los controles Swing se puede incluir HTML label.setText( "<html>texto negro " + "<font color=#ff0000>" + "texto rojo</font></html>");
Iconos
Los iconos se utilizan para proporcionar imagen a diversos controles
Interfaz Icon iconHeight / iconWidth paintIcon(Component, Graphics, x, y)
Clase ImageIcon Propiedades: image, description Se construye a partir de un objeto Image, ruta a
fichero, URL o un array de bytes con los datos de la imagen
Soporta JPEG, PNG, GIF y XBM
Botones AbstractButton: clase base de todos los botones
JButton: botón estándar JToggleButton: botón bi-estado
JCheckBox: casilla de verificación JRadioButton: botón de opción
Propiedades: text: Texto icon, pressedIcon, disabledIcon, rolloverIcon,
selectedIcon: iconos para los distintos estados action: Acción asignada al botón
Eventos ActionEvent: El botón se ha pulsado ChangeEvent: Se ha cambiado alguna propiedad del modelo ItemEvent: El botón se ha seleccionado o deseleccionado
(para JToggleButton)
Botones - modelo
El estado de un botón se guarda en un modelo ButtonModel Propiedades:
actionCommand, group, mnemonic armed, enabled, pressed, rollover, selected
Eventos: ActionEvent, ChangeEvent, ItemEvent
La clase DefaultButtonModel implementa ButtonModel
ButtonGroup La clase ButtonGroup agrupa lógicamente
varios botones (normalmente JRadioButton) Sólo uno de los botones puede estar seleccionado a
la vez No es un control visual
Propiedades: buttonCount, elements selection: devuelve el modelo del botón
seleccionado Métodos:
add(AbstractButton) / remove(AbstractButton) isSelected(ButtonModel) / setSelected(ButtonModel, boolean)
Controles de texto
JTextField: campo de texto JPasswordField: campo de texto oculto JFormattedTextField: campo de texto
con patrón (e-mail, cuentas bancarias,...)
JTextArea: área de texto multilínea JTextPane: editor de documentos JEditorPane: editor para un tipo de
documento concreto
JTextComponent Clase base de los controles de texto Propiedades:
text, selectedText, selectionStart, selectionEnd actions, editable, margin caret, caretPosition, caretColor disabledTextColor, selectionColor, selectedTextColor document, keyMap, highlighter, focusAccelerator
Métodos cut(), copy(), paste() select(start,end), selectAll(), moveCaretPosition(pos) replaceSelection(nuevoTexto) getText(inicio,longitud) write(Writer), read(Reader, desc)
Eventos CaretEvent
JTextField Propiedades:
action columns horizontalAlignment horizontalVisibility
Eventos: ActionEvent
JPasswordField Propiedades:
echoChar, getPassword()
JTextArea
Propiedades: columns, rows lineCount, tabSize lineWrap, wrapStyleWord
Métodos append(texto) insert(texto,pos) repaceRange(texto,inicio,fin) getLineStartOffset(linea),
getLineEndOffset(linea) getLineOfOffset(offset)
Practica controles básicos
Formulario de entrada de datos Nombre CheckBox Mayor de edad
NIF Estado civil
Botones de opcion (Soltero, casado, viudo,...)
JFormattedTextField
Propiedades: formatter, formatterFactory editValid value
Métodos: commitEdit()
Formato del texto
Para fechas y números, se puede crear el JFormattedTextField directamente new JFormattedTextField(new Integer(1))
Obtener el valor como Number new JFormattedTextField(new Date())
O utilizar las clases DateFormatter, NumberFormatter
Para otros tipos de datos, se debe implementar un Formatter
DefaultFormatter
Propiedades allowsInvalid commitsOnValidEdit overwriteMode valueClass
Métodos stringToValue(string), valueToString(value)
Si no lanzan excepción, el valor o la cadena se consideran válidos
install(JFormattedTextField), uninstall() Se llaman automáticamente
MaskFormatter Formatea contra un patrón
Cadena de texto formada por literales (texto fijo) y comodines (texto variable)
* – cualquier carácter A – alfanumérico ? – alfabético U – alfabético mayúsculas L – alfabético minúsculas # – numérico H – hexadecimal ' – para escapar un comodín
Propiedades: mask validCharacters, invalidCharacters placeholder, placeholderCharacter valueContainsLiteralCharacters
DefaultFormatterFactory
Al control JFormattedTextField no se le indica directamente el formateador, sino que se le da una factoría
Se compone de cuatro formateadores defaultFormatter displayFormatter: cuando el control no tiene
foco editFormatter: cuando el control tiene foco nullFormatter: cuando el control está vacío
Practica texto con formato
Añadir al formulario de entrada de datos un campo cuenta bancaria
XXXX-XXXX-XX-XXXXXXXXXX
Cursores de texto
Indican la posición del cursor en un control de texto
Interfaz Caret Propiedades:
dot, mark visible, selectionVisible blinkRate magicCaretPosition
Métodos install(JTextComponent), deinstall(JTextComponent) moveDot(dot) paint(Graphics)
DefaultCaret
Representa el cursor como una línea vertical (deriva de Rectangle)
Implementa los métodos de Caret Para crear un cursor propio,
derivar de DefaultCaret y sobrescribir paint()
Marcadores
Encargados de resaltar el texto seleccionado
El interfaz Highlighter sólo contiene las áreas que se deben resaltar Propiedad highlights
El interfaz Highlighter.HighlightPainter es el que se debe implementar para modificar el aspecto de la selección Método paint(Graphics,
p0,p1,bounds,component) Se llama antes de pintar el texto
Keymaps Hacen corresponder pulsaciones de tecla con acciones
KeyStroke con Action Interfaz Keymap
Propiedades boundActions, boundKeyStrokes defaultAction name resolveParent
Métodos: addActionForKeyStroke(KeyStroke, Action) getAction(KeyStroke) getKeyStrokesForAction(Action) isLocallyDefined(KeyStroke) removeBindings() removeKeyStrokeBinding(KeyStroke)
Añadir Keymaps 1.- Obtener el Keymap del componente
Keymap parentMap = comp.getKeymap(); 2.- Crear un nuevo Keymap con el original como padre
Keymap newMap = JTextComponent.addKeymap("MyMap",parentMap);
3.- Definir las correspondencias del nuevo Keymap KeyStroke ctrlU = KeyStroke.getKeyStroke(
KeyEvent.VK_U, InputEvent.CTRL_MASK);
Action actionUndo = new UndoAction(); newMap.addActionForKeyStroke(ctrlU, actionUndo);
4.- Establecer el nuevo Keymap en el componente comp.setKeymap(newMap);
Practica KeyMaps
Practica Editor
Editor de textos (notepad) Añadir al formulario de entrada de
datos un KeyMap Ctrl+B para borrar el contenido de una casilla de texto
Controles de rango
JScrollBar, JProgressBar, JSlider Utilizan BoundedRangeModel
Propiedades: minimum / maximum: valor mínimo y
máximo value: valor actual extent: tamaño de ventana
Eventos: ChangeEvent
JScrollBar
Barra de desplazamiento Normalmente se utiliza JScrollPane, en lugar
de controles JScrollBar independientes Propiedades:
unitIncrement, blockIncrement: incremento en el valor al pulsar en las flechas o en la barra
visibleAmount: tamaño del botón de arrastre. Equivale al extent del modelo
orientation: barra horizontal o vertical
JSlider Control de “volumen” Propiedades:
orientation: horizontal o vertical inverted: los valores se despliegan al revés
(de derecha a izquierda o de abajo a arriba) labelTable: etiquetas de los valores principales paintLabels / paintTicks / paintTrack: indican si se dibujan las
etiquetas, marcas y guía del control snapToTicks: el control se ajusta a las marcas extent: cuánto cambia el valor al pulsar teclas majorTickSpacing / minorTickSpacing: intervalo entre marcas
principales y secundarias Métodos:
createStandardLabels(incremento, inicio)Crea una tabla de etiquetas para asignar a la propiedad labelTable
Práctica Slider
Dialogo de selección de color
JProgressBar
Barra de progreso Propiedades:
borderPainted: dibujar el borde de la barra indeterminate: no se conoce el valor máximo de
progreso. Muestra una animación. orientation: horizontal o vertical percentComplete: valor de progreso calculado
entre 0.0 y 1.0 string: mensaje que se muestra sobre la barra.
Si es null, se muestra el porcentaje stringPainted: dibujar el mensaje sobre la barra
Realizar operaciones costosas
Normalmente, las barras de progreso muestran el avance de operaciones que duran mucho tiempo
Estas operaciones se deben lanzar en un thread de trabajo independiente para no interrumpir el thread de eventos
Para actualizar la barra de progreso durante la operación:
Desde el thread de trabajo, utilizando SwingUtilities.invokeLater()
Desde un timer, utilizando información de progreso proporcionada por el thread de trabajo
Lanzar un thread
Clase Thread El constructor recibe un objeto Runnable
Implementar método run() La ejecución se inicia con el método start()
Runnable r = new Runnable() { public void run() { // Operación costosa }};
Thread t = new Thread(r); t.start();
Práctica ProgressBar
Abrir un fichero y mostrar el progreso de la lectura en una barra de progreso Leer el fichero byte a byte para que la
lectura resulte más costosa
ProgressMonitor Diálogo genérico de progreso
Muestra una etiqueta estática, otra dinámica y una barra de progreso
Propiedades: canceled: se ha pulsado Cancelar en el diálogo maximum / minimum / progress: valor máximo, mínimo y actual de
la barra de progreso Con setProgress() se va indicando el progreso al monitor
note: texto que se muestra en la etiqueta dinámica millisToDecideToPopup: milisegundos que espera para calcular
la duración del proceso millisToPopup: duración del proceso a partir de la cual se
muestra el diálogo El diálogo no aparece inmediatamente.
Espera millisToDecideToPopup Calcula la duración estimada del proceso Si la duración calculada excede millisToPopup, muestra el
diálogo
ProgressMonitorInputStream
Encapsula otro stream y muestra un ProgressMonitor con el progreso de lectura del stream
Constructor: ProgressMonitorInputStream( parentComponent, message, inputStream)
Métodos: read() / read(byte[]) / read(byte[],off,len) skip(n) close() reset()
Práctica ProgressMonitor
Modificar la práctica anterior para abrir el fichero con un ProgressMonitorInputStream
Listas
Un control lista (JList) utiliza 3 componentes ListModel: Modelo de los datos de la
lista ListSelectionModel: Modelo de la
selección de una lista ListCellRenderer: Controla como se
muestra un elemento de la lista
ListModel
Interfaz que modela el contenido de una lista Propiedades:
size: tamaño de la lista elementAt(i): devuelve el elemento en la posición i
de la lista Eventos:
ListDataEvent: Se ha modificado el contenido de la lista
Los métodos para añadir y quitar elementos de la lista se especifican en las clases que implementan ListModel
ListDataEvent
Evento que se lanza cuando se modifica el contenido de una lista
Propiedades: index0, index1: rango de elementos
afectados source: objeto que lanza el evento type: tipo de operación realizada
CONTENTS_CHANGED INTERVAL_ADDED INTERVAL_REMOVED
DefaultListModel Implementación por defecto de ListModel
Deriva de AbstractListModel: Clase abstracta que implementa el lanzamiento de eventos de ListModel
Propiedades: elementAt(i): da acceso al elemento en la posición i empty: indica si la lista está vacía size: nº de elementos de la lista
Métodos addElement(elemento): añade un elemento al final de la lista insertElementAt(elemento,i): inserta un elemento en la
posición i removeElement(elemento) / removeElementAt(i):
borra un elemento, indicando el elemento o la posición que ocupa removeRange(i,j): elimina los elementos entre las posiciones i y j removeAllElements(): borra todos los elementos de la lista
DefaultListModel (2) Métodos
elements(): devuelve un Enumeration para recorrer la lista firstElement() / lastElement(): devuelve el primer / último elemento contains(elemento): indica si la lista contiene el elemento indexOf(elemento) / lastIndexOf(elemento): devuelve el primer o el
último índice en el que se encuentra el elemento capacity(): devuelve la capacidad de la lista ensureCapacity(capacidad): aumenta la capacidad de la lista trimToSize(): elimina la capacidad que sobra copyInto(Object[] array) / toArray(): copia el contenido de la lista en
un array toString(): devuelve una cadena con los elementos de la lista separados
por comas size() / elementAt(i) / get(i) / set(i,elemento) /
add(i,elemento) / remove(i) / clear()Métodos adicionales con otros nombres
ListSelectionModel Una selección en una lista se representa por un conjunto de rangos Propiedades:
selectionMode: Modo de selección SINGLE_SELECTION / SINGLE_INTERVAL_SELECTION / MULTIPLE_INTERVAL_SELECTION
selectionEmpty: indica si no hay nada seleccionado anchorSelectionIndex / leadSelectionIndex: primer y último índice de la selección
más reciente minSelectionIndex / maxSelectionIndex: primer y último índice seleccionado (puede
haber elementos no seleccionados en medio) Métodos
addSelectionInterval(i,j): Añade el rango a la selección removeSelectionInterval(i,j): Quita el rango de la selección clearSelection(): vacía la selección setSelectionInterval(i,j): borra la selección y la establece al rango indicado isSelectedIndex(i): indica si un índice está seleccionado insertIndexInterval(i,longitud,antes): sincroniza la selección después de insertar
datos en la lista removeIndexInterval(i,j): sincroniza la selección después de eliminar datos en la
lista Eventos:
ListSelectionEvent: se ha modificado la selección
ListCellRenderer
Para pintar los elementos de la lista, JList utiliza un objeto ListCellRenderer
Métodos: getListCellRendererComponent(JList, valor,
indice, seleccionado, tieneFoco)Devuelve un Component que se utiliza para representar el elemento de la lista
DefaultListCellRenderer proporciona la implementación del renderer por defecto.
JList JList es la lista estándar
No realiza scrolling, hay que incluirla en un JScrollPane Propiedades:
selectedIndex, isSelectedIndex, selectedIndices selectedValue, selectedValues firstVisibleIndex, lastVisibleIndex, visibleRowCount fixedCellWidth, fixedCellHeight selectionBackground, selectionForeground layoutOrientation
VERTICAL, VERTICAL_WRAP, HORIZONTAL_WRAP Métodos
setListaData(array) ensureIndexIsVisible(index) getNextMatch(prefijo,inicio,direccion)
dirección: Position.Bias.Forward / Position.Bias.Backward indexToLocation(index) / locationToIndex(location)
ComboBox
Es una combinación de una caja de texto y una lista
El editor puede ser cualquier control que implemente ComboBoxEditor
Utiliza un ListCellRenderer El modelo es ComboBoxModel, que
contiene tanto los datos como la selección
DefaultComboBoxModel
ListModel
ComboBoxModelselectedItem
MutableComboBoxModeladdElement, removeElement, ...
DefaultComboBoxModelDefaultComboBoxModel
AbstractListModelImplementa ListDataEvent
JComboBox Propiedades:
editor, keySelectionManager, renderer, model action, actionCommand, maximumRowCount editable, popupVisible, lightWeightPopupEnabled selectedIndex, selectedItem, selectedObjects
Métodos addItem(item) / insertItemAt(item,i) removeItem(item) / removeItemAt(i) getItemCount() / getItemAt(i) showPopup() / hidePopup() selectWithKeyChar(char)
Eventos ActionEvent: el usuario ha seleccionado un elemento de la lista ItemEvent: la selección ha cambiado PopupMenuEvent: antes de mostrar la lista desplegable
Practica listas
Crear un formulario con una lista con las fuentes del sistema GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts();
Cambiar la fuente de un JTextArea cuando se seleccione de la lista
Practica ListCellRenderer
Añadir a la lista de fuentes un renderer que muestre el nombre de la fuente utilizando la propia fuente
Spinner
Un spinner es similar a un combobox Una caja de texto Una lista de valores Dos botones para ir al valor siguiente y al
anterior Se pueden utilizar para:
Números enteros Fechas Listas de valores (meses, colores,...)
JSpinner Propiedades:
editor, model, value nextValue, previousValue
Constructores: JSpinner(SpinnerModel)
Métodos commitEdit() createEditor(SpinnerModel)
Eventos: ChangeEvent
SpinnerModel
Propiedades: value, nextValue, previousValue
Evento: ChangeEvent
SpinnerModel
AbstractSpinnerModel
SpinnerDateModel SpinnerListModel SpinnerNumberModel
Modelos de Spinner SpinnerDateModel
calendarField campo de la fecha que cambia con los botones Calendar.MONTH, Calendar.YEAR,...
start, end, date SpinnerListModel
list SpinnerNumberModel
minimum, maximum number stepSize
Editores de spinner DefaultEditor
spinner, textField commitEdit(), dismiss(JSpinner)
DateEditor format, model
ListEditor model
NumberEditor format, model
Se puede utilizar cualquier componente Implementar ChangeListener para detectar la
pulsación de los botones del spinner
Contenedores
Contenedores especiales JLayeredPane
Muestra sus controles uno encima de otro JScrollPane
Contiene un control y le añade barras de desplazamiento
JSplitPane Contiene dos controles y permite cambiar el
tamaño entre ellos arrastrando una barra JTabbedPane
Contiene varios controles y presenta cada uno en una pestaña
JLayeredPane
Organiza los controles por capas Los controles dentro de una capa tienen un
orden y se muestran uno encima de otro Los controles de una capa superior
aparecen siempre por encima de las capas inferiores
Capas por defecto (de arriba a abajo) DRAG_LAYER, POPUP_LAYER,
MODAL_LAYER, PALETTE_LAYER, DEFAULT_LAYER, FRAME_CONTENT_LAYER
Métodos de JLayeredPane add(control, capa, posicion) remove(index) getComponentCountInLayer(capa) getComponentsInLayer(capa) getLayer(control) getPosition(control)
Posición dentro de la capa getIndexOf(control)
Posición dentro del JLayeredPane setLayer(control, capa)
setLayer(control, capa, posicion) setPosition(control, posicion) highestLayer(), lowestLayer() moveToBack(control), moveToFront(control)
JScrollPane
Añade barras de desplazamiento a un control Las barras de desplazamiento sólo se
muestran si son necesarias También se pueden incluir cabeceras de
columna, de fila y controles en las esquinas
ViewPort
Esquina
Esquina Esquina
EsquinaCabecera de columna
Cabecera de fila
Barra vertical
Barra horizontal
JScrollPane Propiedades:
viewport, viewportView columnHeader, columnHeaderView rowHeader, rowHeaderView horizontalScrollBar, verticalScrollBar horizontalScrollBarPolicy,
verticalScrollBarPolicy HORIZONTAL_SCROLLBAR_ALWAYS HORIZONTAL_SCROLLBAR_NEVER HORIZONTAL_SCROLLBAR_AS_NEEDED
Métodos: getCorner(esquina), setCorner(esquina,control)
LOWER_LEFT_CORNER, LOWER_RIGHT_CORNERUPPER_LEFT_CORNER, UPPER_RIGHT_CORNER
JViewPort
Un control ViewPort contiene un control que puede ser más grande que su contenedor El componente principal de
JScrollPane, así como las cabeceras de fila y columna son componentes JViewPort
El contenido de un JViewPort se establece con la propiedad view
JSplitPane Contiene dos controles separados por una
barra móvil Propiedades:
topComponent, leftComponent bottomComponent, rightComponent oneTouchExpandable, continuousLayout orientation
HORIZONTAL_SPLIT, VERTICAL_SPLIT dividerLocation, lastDividerLocation dividerSize, resizeWeight
Métodos setDividerLocation(percent)
JTabbedPane Contiene varios controles, uno en cada pestaña Propiedades:
componentAt, tabCount enabledAt, backgroundAt, foregroundAt titleAt, iconAt, disabledIconAt, mnemonicAt, toolTipTextAt selectedIndex, selectedComponent tabLayoutPolicy
SCROLL_TAB_LAYOUT, WRAP_TAB_LAYOUT tabPlacement
TOP, BOTTOM, LEFT, RIGHT (SwingConstants) Métodos
addTab(titulo,icono,control,tooltip) insertTab(titulo,icono,control,tooltip,index) indexAtLocation(x,y) indexOfComponent(c), indexOfTab(titulo), indexOfIcon(icono) remove(componente), removeTabAt(i), removeAll()
Eventos: ChangeEvent
Applets
Applets
Ventanas que se ejecutan en un navegador
Funcionalidad restringida ("Caja de arena") No pueden tocar el disco local (ni escribir, ni
leer) Hay que bajarlo cada vez que se ejecuta
Ventajas: No hay instalación No hay peligro de dañar el sistema del
cliente
JApplet
Para construir un applet, se construye una clase que deriva de JApplet
Se sobrescriben los métodos necesarios init(): Primera inicialización del applet start(): Cada vez que se visualiza el
applet stop(): Cuando se oculta el applet destroy(): Cuando se libera el applet
Mi primer Applet!
import javax.swing.*;
import java.awt.*;
public class MiApplet extends JApplet {
public void init() {
JLabel label = new JLabel("Applet!");
getContentPane().add(label);
}
}
import javax.swing.*;
import java.awt.*;
public class MiApplet extends JApplet {
public void init() {
JLabel label = new JLabel("Applet!");
getContentPane().add(label);
}
}
Ejecutar el applet:En un navegador
Hay que construir una página web que contenga el applet
Al principio, el código era sencillo:
<applet code="MiApplet" width=100 height=50></applet>
<applet code="MiApplet" width=100 height=50></applet>
Ejecutar el applet:En un navegador
Ahora, ya no tanto:<OBJECT
classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" width="100" height="50" align="baseline"codebase="http://java.sun.com/products/plugin/1.2.2/jinstall-
1_2_2-win.cab#Version=1,2,2,0"><PARAM NAME="code" VALUE="MiApplet.class"><PARAM NAME="codebase" VALUE="."><PARAM NAME="type" VALUE="application/x-java-applet;version=1.2.2"><COMMENT>
<EMBED type="application/x-java-applet;version=1.2.2"width="100" height="50" align="baseline"code="MiApplet.class" codebase="."pluginspage="http://java.sun.com/products/plugin/1.2/
plugin-install.html"<NOEMBED>No soporta applets Java 2!</NOEMBD>
</EMBED></COMMENT>
</OBJECT>
<OBJECTclassid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" width="100" height="50" align="baseline"codebase="http://java.sun.com/products/plugin/1.2.2/jinstall-
1_2_2-win.cab#Version=1,2,2,0"><PARAM NAME="code" VALUE="MiApplet.class"><PARAM NAME="codebase" VALUE="."><PARAM NAME="type" VALUE="application/x-java-applet;version=1.2.2"><COMMENT>
<EMBED type="application/x-java-applet;version=1.2.2"width="100" height="50" align="baseline"code="MiApplet.class" codebase="."pluginspage="http://java.sun.com/products/plugin/1.2/
plugin-install.html"<NOEMBED>No soporta applets Java 2!</NOEMBD>
</EMBED></COMMENT>
</OBJECT>
HtmlConverter
La utilidad HtmlConverter sustituye las etiquetas <APPLET> por las correspondientes <OBJECT>
Ejecutar el applet:AppletViewer
El JDK incluye la utilidad appletviewer que muestra un applet contenido en una etiqueta <APPLET> ignorando el resto de la página Se puede incluir la etiqueta
<APPLET> como comentarios del codigo fuente
Ahorra el trabajo de crear la página para probar el applet
Ejecutar el applet:AppletViewer
Se ejecuta: appletviewer MiApplet.java(hay que compilar primero)
// Etiqueta para appletviewer
// <applet code="MiApplet" width=100 height=50>
// </applet>
import javax.swing.*;
import java.awt.*;
public class MiApplet extends JApplet {
public void init() {
JLabel label = new JLabel("Applet!");
getContentPane().add(label);
}
}
// Etiqueta para appletviewer
// <applet code="MiApplet" width=100 height=50>
// </applet>
import javax.swing.*;
import java.awt.*;
public class MiApplet extends JApplet {
public void init() {
JLabel label = new JLabel("Applet!");
getContentPane().add(label);
}
}
Ejecutar el applet:Añadir un metodo main
Se puede añadir un método main a la clase applet para poder ejecutarlo directamente
Añadirlo a una ventana contenedora (JFrame) Llamar a los métodos init() y start()
public static void main(String[] args) {
JApplet applet = new MiApplet();
JFrame frame = new JFrame("MiApplet");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(applet);
frame.setSize(100,50);
applet.init();
applet.start();
frame.setVisible(true);
}
public static void main(String[] args) {
JApplet applet = new MiApplet();
JFrame frame = new JFrame("MiApplet");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(applet);
frame.setSize(100,50);
applet.init();
applet.start();
frame.setVisible(true);
}
MDI (Frames internos)
Arquitectura
Se crea un "escritorio virtual" en la ventana contenedora JDesktopPane
Es un JLayeredPane Utiliza un DesktopManager para gestionar las
ventanas En el escritorio se muestran ventanas
secundarias JInternalFrame
Tiene una estructura muy similar a JFrame No son ventanas nativas
JInternalFrame Propiedades:
rootPane, contentPane, glassPane, JMenuBar defaultCloseOperation title, desktopIcon, frameIcon closable, iconifiable, maximizable, resizable closed, icon, maximum, selected, layer, normalBounds
Eventos InternalFrameEvent
Métodos moveToBack(), moveToFront() show(), dispose() pack(), reshape(x,y,w,h) doDefaultCloseAction() getFocusOwner(), getMostRecentFocusOwner() updateUI(), restoreSubcomponentFocus()
JDesktopPane
Propiedades: allFrames, selectedFrame desktopManager dragMode
Métodos getAllFramesInLayer(i) updateUI()
DesktopManager
Implementado por DefaultDesktopManager
Métodos openFrame(f), closeFrame(f) activateFrame, deactivateFrame(f) iconifyFrame(f), deiconifyFrame(f) maximizeFrame(f), minimizeFrame(f) setBoundsForFrame(f,x,y,w,h) dragFrame(f,x,y), resizeFrame(f,x,y,w,h)
Diálogos
JDialog
Es un frame que puede ser modal Tiene las misma estructura de
JFrame Añade la propiedad modal
JOptionPane
Se utiliza para crear diálogos típicos Icono Área de mensaje Área de introducción de datos Botones de opción
TítuloX
IconoMensaje
Input
Botón 1 Botón 2
Tipos de diálogo JOptionPane contiene métodos estáticos para crear
cuatro tipos de diálogo showMessageDialog()
Diálogo para mostrar un mensaje showConfirmDialog()
Diálogo para confirmar una acción showInputDialog()
Diálogo para pedir un valor al usuario showOptionDialog()
Diálogo libre completamente personalizable Cada uno de estos métodos tiene una versión que crea
un JInternalFrame en lugar de un JDialog showInternalMessageDialog() showInternalConfirmDialog() showInternalInputDialog() showInternalOptionDialog()
Parámetros de JOptionPane parentComponent: ventana padre message: mensaje a mostrar
Puede ser también un control o un icono title: título del diálogo optionType: botones que se muestran
DEFAULT_OPTION, YES_NO_OPTION, YES_NO_CANCEL_OPTION, OK_CANCEL_OPTION
messageType: indica el tipo de mensaje WARNING_MESSAGE, QUESTION_MESSAGE, INFO_MESSAGE,
ERROR_MESSGE, PLAIN_MESSAGE icon: icono que se muestra
Si es null, depende de messageType selectionValues: (InputDialog) lista de valores de selección initialSelectionValue: valor seleccionado inicialmente options: (OptionDialog) botones que se muestran.
Se pueden proporcionar strings o iconos initialValue: (OptionDialog) botón que tiene el foco
inicialmente
Valores de retorno Los métodos estáticos devuelven el
valor introducido por el usuario showMessageDialog() no devuelve valor showConfirmDialog()
YES_OPTION, NO_OPTION, CANCEL_OPTION, OK_OPTION, CLOSED_OPTION
showInputDialog() String introducido en la caja de texto o valor
seleccionado de selectionValues showOptionDialog()
Índice de la opción seleccionada del parámetro options o una constante como showConfirmDialog()
Constructores JOptionPane
Además de utilizar los métodos estáticos, se pueden utilizar los constructores de JOptionPane para crear un panel independiente e incluirlo en un contenedor
Para obtener el valor introducido por el usuario, se utiliza el método getValue()
JFileChooser Muestra un diálogo para abrir o guardar un fichero Propiedades:
dialogType OPEN_DIALOG, SAVE_DIALOG, CUSTOM_DIALOG
currentDirectory selectedFile, selectedFiles fileSelectionMode
FILES_ONLY, DIRECTORIES_ONLY, FILES_AND_DIRECTORIES multiSelectionEnabled directorySelectionEnabled, fileSelectionEnabled fileFilter, choosableFileFilters acceptAllFileFilter, fileHidingEnabled
Eventos: ActionEvent
JFileChooser: Métodos addChoosableFileFilter(FileFilter)removeChoosableFileFilter(FileFilter)
changeToParentDirectory() ensureFileIsVisible(f) getName(f), getIcon(f), getDescription(f), getTypeDescription(f)
rescanCurrentDirectory() showDialog(parent, textoBoton)showOpenDialog(parent)showSaveDialog(parent)
Devuelven APPROVE_OPTION, CANCEL_OPTION, ERROR_OPTION
FileFilter
Para especificar el tipo de ficheros que se quieren buscar, se utilizan objetos que implementen el interfaz FileFilter
Métodos: boolean accept(File)
Indica si el fichero es seleccionable por el filtro
String getDescription() Devuelve la descripción que se muestra
en la lista de filtros
FileSystemView Se utiliza la clase FileSystemView para
inspeccionar el sistema de ficheros FileSystemView.getFileSystemView()
Devuelve el FileSystemView apropiado para el sistema operativo
Métodos: createNewFolder(directorioPadre) getFiles(directorio, noMostrarOcultos) getRoots() isHiddenFile(f) isRoot(f)
JColorChooser Permite seleccionar un color Propiedades:
chooserPanels color previewPanel
Métodos showDialog(padre,titulo,color) addChooserPanel(panel) removeChooserPanel(panel) setColor(int), setColor(r,g,b)
Menús y toolbars
Menús
Los elementos de menú son muy configurables Iconos Radio buttons Check box Teclas rápidas Elementos de menú propios
Jerarquía de menús
JComponent
AbstractButton
JMenuItem
JPopUpMenuJMenuBar
JCheckBoxMenuItem JMenu JRadioButtonMenuItem
MenuElement
Estructura del menú
Barra de menú(JMenuBar)
Menú(JMenu)
Submenú(JMenu)
Separador(JSeparator)
Elementos de menú(JMenuItem)
Menú pop-up(JPopupMenu)
Añadir un menú a un frame
// Crear barra de menúJMenuBar menuBar = new JMenuBar();// Crear menúJMenu menu = new JMenu("Archivo");// Crear elementos de menúJMenuItem salir = new JMenuItem("Salir");salir.addActionListener(salirListener);// Añadir elementos al menúmenu.add(salir);// Añadir el menú a la barramenuBar.add(menu);// Añadir la barra al frameframe.setJMenuBar(menuBar);
// Crear barra de menúJMenuBar menuBar = new JMenuBar();// Crear menúJMenu menu = new JMenu("Archivo");// Crear elementos de menúJMenuItem salir = new JMenuItem("Salir");salir.addActionListener(salirListener);// Añadir elementos al menúmenu.add(salir);// Añadir el menú a la barramenuBar.add(menu);// Añadir la barra al frameframe.setJMenuBar(menuBar);
JMenuBar
Barra de menús Tiene una localización específica en el
frame Propiedades
borderPainted menu(i), menuCount selected, selectionModel
Métodos add(JMenu) getComponentIndex(Component) setSelected(Component)
SingleSelectionModel
Sólo puede haber seleccionado un único elemento de menú
Propiedades selected selectedIndex
Implementado por DefaultSingleSelectionModel
JMenuItem Representa un elemento de menú Propiedades
text, image, action accelerator, mnemonic armed, enabled horizontalAlignment, verticalAlignment horizontalTextPosition, verticalTextPosition subElements
Eventos ActionEvent, ChangeEvent MenuDragMouseEvent, MenuKeyEvent
JPopupMenu Representa un menú desplegable Propiedades
invoker, label borderPainted lightWeightPopupEnabled
Métodos add(JMenuItem), add(Component), add(Action) insert(Component,i), insert(Action,i) addSeparator(), insertSeparator(i) show(invoker,x,y)
Eventos PopupMenuEvent
JMenu Un elemento de menú que despliega un menú
Deriva de JMenuItem y utiliza JPopupMenu Propiedades:
popupMenu, popupMenuVisible topLevelMenu, delay item(i), itemCount
Métodos: add(JMenuItem/Component/Action/String) addSeparator() insert(JMenuItem/Action/String,i) insertSeparator(i)
Eventos MenuEvent
Menús seleccionables
JCheckBoxMenuItem Menú con una casilla de verificación Propiedad:
state JRadioButtonMenuItem
Menú de opción No añade propiedades especiales Se utiliza con ButtonGroup
JSeparator
Es una separación en el menú Para añadir al menú:
add(new JSeparator()) Los separadores que se añaden con addSeparator() no suelen ser JSeparator
Se puede usar como control independiente en otros contenedores
JToolBar
Barra de herramientas Pueden contener cualquier tipo de control Son flotantes
Propiedades: borderPainted, margin, rollover componentAtIndex(i) floatable, orientation
Métodos: add(JComponent/Action) addSeparator()
Tablas
JTable
Representa una tabla de datos Se apoya en varios modelos
TableModel: datos TableColumnModel: columnas
visuales ListSelectionModel: selección (de
filas) Sólo tiene propiedades de
apariencia Los valores se modifican a través de
los modelos
JTable: propiedades
Propiedades de fila/columna/celda: autoCreateColumnsFromModel autoResizeMode
AUTO_RESIZE_ALL_COLUMNS, AUTO_RESIZE_NEXT_COLUMN, AUTO_RESIZE_OFF
columnCount, columnModel model rowCount, rowHeight
JTable: propiedades
Propiedades de selección: cellSelectionEnabled columnSelectionAllowed rowSelectionAllowed selectedColumn, selectedColumns, selectedColumnCount
selectedRow, selectedRows, selectedRowCount
selectionMode selectionModel
JTable: propiedades
Otras propiedades: tableHeader cellEditor dragEnabled gridColor, selectionBackground, selectionForeground
showGrid, showHorizontalLines, showVerticalLines
interCellSpacing, rowMargin
JTable: constructores
JTable() JTable(TableModel) JTable(TableModel,
TableColumnModel) JTable(TableModel,
TableColumnModel, ListSelectionModel)
JTable(nRows,nCols) JTable(data, columnNames)
JTable: métodos
addColumnSelectionInterval(c0,c1) removeColumnSelectionInterval(c0,c1) addRowSelectionInterval(r0,r1) removeRowSelectionInterval(r0,r1) clearSelection(), selectAll() columnAtPoint(p), rowAtPoint(p) editCellAt(row,col,EventObject) moveColumn(pos,newPos)
TableColumn
Modela una columna de la tabla Propiedades
cellEditor, cellRenderer, headerRenderer
identifier, headerValue width, maxWidth, minWidth modelIndex
Índice de la columna en el modelo de datos
resizable
TableColumnModel Contiene las columnas visuales de la tabla
También gestiona la selección de columnas Propiedades:
column(i), columnCount, columns columnMargin columnSelectionAllowed selectedColumns, selectedColumnCount selectionModel totalColumnWidth
Métodos addColumn(col), removeColumn(col) getColumnIndex(identifier) getColumnIndexAtX(x) moveColumn(pos,newPos)
TableModel
Contiene los datos de la tabla Propiedades:
columnCount, rowCount Métodos:
getValueAt(row,col) isCellEditable(row,col) setValueAt(valor,row,col)
DefaultTableModel
Añade las propiedades: columnName(i), columnSelected(i),
columnClass(i) rowSelected(i)
Y los métodos: addColumn(colID), addColumn(colID, data) addRow(data), insertRow(pos,data) moveRow(startIdx,endIdx,destIdx) removeRow(idx)
Eventos: TableModelEvent
TableCellRenderer
Las celdas se muestran utilizando un renderer
Se puede implementar este interfaz para crear un renderer propio getTableCellRendererComponent(
table,value,isSelected,hasFocus,row,col) La clase DefaultTableCellRenderer
genera controles JLabel Para que la tabla utilice el renderer, se
utiliza el siguiente método, que utiliza el renderer para un determinado tipo de valor setDefaultRenderer(class,renderer)
Edición
Para editar la tabla, se debe indicar el editor que se utiliza para cada tipo de datos setDefaultEditor(class,editor)
Para indicar el editor, se puede implementar un TableCellEditor propio getTableCellEditorComponent(
table,value,isSelected,row,col) O utilizar DefaultTableCellEditor
indicando el control a utilizar new DefaultTableCellEditor(componente)
Practica tablas
Query Browser Formulario con un JTextArea y un JTable
separados por un SplitPane Botón Conectar
Pide una URL JDBC y conecta a la BD Botón Ejecutar Consulta
Ejecuta un statement JDBC con el contenido del JTextArea
Si es consulta: muestra los resultados en el JTable Si no, muestra un mensaje con el nº de filas
afectadas
Árboles
Terminología Nodo (Node): Cualquier elemento del árbol Hijo (Child): un nodo que cuelga de otro nodo Padre (Parent): un nodo del que cuelgan otros nodos Hermanos (Sibling): dos nodos con el mismo padre Descendiente (Descendant): un hijo, o hijo de un hijo,... Ancestro (Ancestor): un padre, o el padre de un padre,... Raíz (Root): el primer nodo del árbol, que no tiene padre Hoja (Leaf): un nodo sin hijos Nivel (Level): distancia del nodo a la raíz Expandir (Expand): visualizar los hijos de un nodo Colapsar (Collapse): ocultar los hijos de un nodo Ruta (Path): lista de nodos entre dos nodos (normalmente,
entre el nodo raíz y un nodo Fila (Row): fila en la que se muestra el nodo visualmente
TreeModel
El modelo de un árbol contiene simplemente una referencia al nodo raíz
Propiedad: root
Métodos: getChild(padre,idx),
getChildCount(padre) getIndexOfChild(padre,hijo) isLeaf(nodo)
DefaultTreeModel
Añade los métodos: getPathToRoot(nodo) insertNodeInto(hijo,padre,index) removeNodeFromParent(nodo) reload(), reload(nodo)
TreeNode
El interfaz más básico para modelar un nodo de un árbol. Sólo permite consultar la estructura del
nodo Propiedades
childCount, childAt(i) parent isLeaf, allowsChildren
Métodos: getIndex(nodo) children()
MutableTreeNode
Añade una propiedad para contener un valor del nodo userObject
Y métodos para modificar la estructura setParent(nodo) insert(hijo,indice) remove(indice), remove(hijo) removeFromParent()
DefaultMutableTreeNode Añade más métodos
add(hijo) getChildAfter(hijo),getChildBefore(hijo) getLevel(), getDepth() getPath(), getUserObjectPath() getFirstChild(), getLastChild() getFirstLeaf(), getLastLeaf() getNextLeaf(), getPreviousLeaf() getLeafCount() getNextSibling(), getPreviousSibling() getSiblingCount() isNodeAncestor(nodo), isNodeChild(nodo) isNodeDescendant(nodo), isNodeSibling(nodo) isRoot()
TreePath
Representa un conjunto de nodos en descendencia
Propiedades: path, pathCount pathComponent(i) parentPath, lastPathComponent()
Métodos: isDescendant(path) pathByAddingChild(nodo)
JTree Propiedades
cellEditor, cellRenderer editable expanded(node), collapsed(node)
Métodos de ruta y fila getPathForLocation(x,y), getRowForLocation(x,y) getClosestPathForLocation(x,y),
getClosestRowForLocation(x,y) getPathBounds(path), getRowBounds(row) getPathForRow(row), getRowForPath(path) isVisible(path), makeVisible(path) scrollPathToVisible(path), scrollRowToVisible(row)
JTree
Métodos de selección clearSelection(), isPathSelected(path) addSelectionInterval(row1,row2) addSelectionPath(path), addSelectionPaths(path[])
addSelectionRow(row), addSelectionRows(rows[]) removeSelectionInterval(row1,row2) removeSelectionPath(path),
removeSelectionPaths(path[]) removeSelectionRow(row), removeSelectionRows(rows[])
setSelectionInterval(row1,row2) setSelectionPath(path), setSelectionPaths(path[])
setSelectionRow(row), setSelectionRows(rows[])
JTree Métodos de expansión
collapsePath(path), collapseRow(row) isCollapsed(path), isCollapsed(row) expandPath(path), expandRow(row) isExpanded(path), isExpanded(row) hasBeenExpanded(path)
Métodos de edición startEditingAtPath(path) cancelEditing(), stopEditing() isEditing(), getEditingPath() isPathEditable(path)
JTree
Eventos: TreeModelEvent TreeSelectionEvent TreeExpansionEvent
TreeExpansionListener y TreeWillExpandListener
Rendering y edición
Al igual que en las tablas, se puede controlar como se muestran y editan los elementos de un árbol DefaultTreeCellRenderer
Proporciona propiedades para controlar los colores, iconos y fuentes que utilizan los nodos
DefaultTreeCellEditor Se inicia con otro TreeCellEditor que es el
que se utiliza para obtener el control de edición
Práctica árboles
Explorador de archivos JTree que va mostrando los directorios
conforme se expanden JList que muestre los ficheros del directorio
seleccionado Añadir un renderer para mostrar el icono del
fichero La clase
javax.swing.filechooser.FileSystemView permite explorar el sistema de archivos, obtener iconos, etc...
Drag & Drop
Drag & Drop sencillo
En el componente origen Establecer la propiedad dragEnabled
del componente a true En el componente destino
Los controles de texto aceptan "drop" directamente
Otros controles utilizan un TransferHandler
TransferHandler Clase encargada de gestionar la transferencia
de datos Métodos:
canImport(JComponent, DataFlavor[]) createTransferable(JComponent) importData(JComponent, Transferable) exportDone(JComponent, Transferable, action) getSourceActions(JComponent) getVisualRepresentation(JComponent)
Constructores: TransferHandler() TransferHandler(String propiedad)
Transferable
Encapsulan los datos que se transfieren
Métodos: getTransferData(DataFlavor) getTransferDataFlavors() isDataFlavorSupported(DataFlavor)
Para strings, usar la clase StringSelection
Tipos de objeto (DataFlavor)
stringFlavor imageFlavor javaSerializedObjectMimeType javaFileListFlavor javaJVMLocalObjectMimeType javaRemoteObjectMimeType Propios:
new DataFlavor(Class, nombre); La clase debe implementar Serializable
Programación D&D
Se utilizan eventos Hay tres elementos en juego
Reconocedor de drags Atiende eventos y detecta cuando se ha iniciado
un arrastre Origen de drag
Inicia el arrastre y proporciona la información necesaria sobre el elemento arrastrado
Destino de drop Puede aceptar (o rechazar) elementos arrastrados
DropTarget
Encapsula el comportamiento de un destino de drop
Propiedades: component, dropTargetContext active, defaultActions, flavorMap
Eventos: DropTargetEvent
Contructor: DropTarget(Component,
DropTargetListener)
DropTargetListener
Métodos: dragEnter(DropTargetDragEvent) dragExit(DropTargetEvent) dragOver(DropTargetDragEvent) drop(DropTargetDropEvent) dropActionChanged(DropTargetDragE
vent)
Eventos Drop DropTargetEvent
Propiedades: dropTargetContext
DropTargetDragEvent Propiedades:
currentDataFlavors currentDataFlavorsAsLis
t dropAction location sourceActions
Métodos acceptDrag(dragOperati
on) rejectDrag()
DropTargetDropEvent Propiedades:
currentDataFlavors currentDataFlavorsAsLis
t dropAction localTransfer location sourceActions transferable
Métodos acceptDrop(dropAction) rejectDrop() dropComplete(ok) isDataFlavorSupported(
df)
DragSource Encapsula un origen de arrastre Propiedades:
defaultDragSource dragImageSupported flavorMap
Métodos: createDefaultDragGestureRecognizer(
Component, actions, DragGestureListener) startDrag(DragGestureEvent,
dragCursor, dragImage, imageOffset,transferable, DragSourceListener,FlavorMap)
Eventos: DragSourceDragEvent
(DragSourceListener, DragSourceMotionListener)
DragGestureRecognizer
Monitoriza un control y detecta inicios de arrastre
Propiedades: component, dragSource sourceActions, triggerEvent
Eventos: DragGestureEvent
Se crea desde el DragSource
Preparar un control para Drag 1.- Implementar un DragGestureListener
DragGestureListener dragGestureListener = new DragGestureListener() {
public void dragGestureRecognized(DragGestureEvent e) {
} }
2.- Preparar el control para Drag JLabel label = new JLabel("Arrastrame"); DragSource ds = new DragSource(); DragGestureRecognizer recognizer =
ds.createDefaultDragGestureRecognizer(label, DnDConstants.ACTION_COPY,dragGestureListener);
Gráficos 2D
Impresión
Enlaces y Bibliografía Web:
Tutorial Swing de Sun http://java.sun.com/docs/books/tutorial/uiswing/
Tutorial Swing de programacion.com http://www.programacion.com/java/tutorial/swing/
Libro Java AWT Reference http://www.oreilly.com/catalog/javawt/book/index.html
Libros: Java Swing 2ª edición
Marc Loy, Robert Eckstein, Dave Wood, James Elliott & Brian Cole (O'Reilly)
Java AWT Reference (descatalogado) John Zukowski (O'Reilly)