Curso de Swing

186
Swing Jorge Guilló – [email protected]

description

Curso de programación de aplicaciones de escritorio en Java con Swing

Transcript of Curso de Swing

Page 1: Curso de Swing

Swing

Jorge Guilló – [email protected]

Page 2: Curso de Swing

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

Page 3: Curso de Swing

Introducción a Swing

Origen y arquitectura

Page 4: Curso de Swing

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

Page 5: Curso de Swing

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)

Page 6: Curso de Swing

Java Foundation Classes

Java Foundation Classes

AWT AccesibilidadSwingJava 2D

Drag &

Drop

Page 7: Curso de Swing

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

Page 8: Curso de Swing

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

}

}

Page 9: Curso de Swing

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

}

});

}

...

Page 10: Curso de Swing

Arquitectura de Swing

Page 11: Curso 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

Page 12: Curso de Swing

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

Page 13: Curso de Swing

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)

Page 14: Curso de Swing

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() {...} });

Page 15: Curso de Swing

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

Page 16: Curso de Swing

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

Page 17: Curso de Swing

Estructura de un JFrame

JFrame

JRootPane

JLayeredPaneJPanel

(Glass Pane)

JMenuBarJPanel

(Content Pane)

Controles

Page 18: Curso de Swing

Estructura de un JFrame

Page 19: Curso de Swing

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

Page 20: Curso de Swing

JComponent: Propiedades background border colorModel components cursor enabled font foreground insets layout

locale location locationOnScreen name parent size showing toolTipText valid visible

Page 21: Curso de Swing

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.

Page 22: Curso de Swing

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

Page 23: Curso de Swing

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

Page 24: Curso de Swing

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

Page 25: Curso de Swing

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

Page 26: Curso de Swing

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

Page 27: Curso de Swing

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)

Page 28: Curso de Swing

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

Page 29: Curso de Swing

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

Page 30: Curso de Swing

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

Page 31: Curso de Swing

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

Page 32: Curso de Swing

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

Page 33: Curso de Swing

Practica Layouts

Crear una calculadora

Page 34: Curso de Swing

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

Page 35: Curso de Swing

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

Page 36: Curso de Swing

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

Page 37: Curso de Swing

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

Page 38: Curso de Swing

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

Page 39: Curso de Swing

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

Page 40: Curso de Swing

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)

Page 41: Curso de Swing

Controles básicos

Page 42: Curso de Swing

Etiquetas Objetos JLabel Las etiquetas pueden tener texto y/o icono Propiedades:

text icon / disabledIcon horizontalAlignment / verticalAlignment horizontalTextPosition / verticalTextPosition

iconTextGap labelFor displayedMnemonic / displayedMnemonicIndex

Page 43: Curso de Swing

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

Page 44: Curso de Swing

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

Page 45: Curso de Swing

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)

Page 46: Curso de Swing

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

Page 47: Curso de Swing

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)

Page 48: Curso de Swing

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

Page 49: Curso de Swing

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

Page 50: Curso de Swing

JTextField Propiedades:

action columns horizontalAlignment horizontalVisibility

Eventos: ActionEvent

JPasswordField Propiedades:

echoChar, getPassword()

Page 51: Curso de Swing

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)

Page 52: Curso de Swing

Practica controles básicos

Formulario de entrada de datos Nombre CheckBox Mayor de edad

NIF Estado civil

Botones de opcion (Soltero, casado, viudo,...)

Page 53: Curso de Swing

JFormattedTextField

Propiedades: formatter, formatterFactory editValid value

Métodos: commitEdit()

Page 54: Curso de Swing

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

Page 55: Curso de Swing

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

Page 56: Curso de Swing

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

Page 57: Curso de Swing

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

Page 58: Curso de Swing

Practica texto con formato

Añadir al formulario de entrada de datos un campo cuenta bancaria

XXXX-XXXX-XX-XXXXXXXXXX

Page 59: Curso de Swing

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)

Page 60: Curso de Swing

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

Page 61: Curso de Swing

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

Page 62: Curso de Swing

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)

Page 63: Curso de Swing

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

Page 64: Curso de Swing

Practica KeyMaps

Page 65: Curso de Swing

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

Page 66: Curso de Swing

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

Page 67: Curso de Swing

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

Page 68: Curso de Swing

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

Page 69: Curso de Swing

Práctica Slider

Dialogo de selección de color

Page 70: Curso de Swing

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

Page 71: Curso de Swing

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

Page 72: Curso de Swing

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

Page 73: Curso de Swing

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

Page 74: Curso de Swing

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

Page 75: Curso de Swing

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

Page 76: Curso de Swing

Práctica ProgressMonitor

Modificar la práctica anterior para abrir el fichero con un ProgressMonitorInputStream

Page 77: Curso de Swing

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

Page 78: Curso de Swing

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

Page 79: Curso de Swing

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

Page 80: Curso de Swing

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

Page 81: Curso de Swing

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

Page 82: Curso de Swing

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

Page 83: Curso de Swing

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.

Page 84: Curso de Swing

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)

Page 85: Curso de Swing

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

Page 86: Curso de Swing

DefaultComboBoxModel

ListModel

ComboBoxModelselectedItem

MutableComboBoxModeladdElement, removeElement, ...

DefaultComboBoxModelDefaultComboBoxModel

AbstractListModelImplementa ListDataEvent

Page 87: Curso de Swing

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

Page 88: Curso de Swing

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

Page 89: Curso de Swing

Practica ListCellRenderer

Añadir a la lista de fuentes un renderer que muestre el nombre de la fuente utilizando la propia fuente

Page 90: Curso de Swing

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

Page 91: Curso de Swing

JSpinner Propiedades:

editor, model, value nextValue, previousValue

Constructores: JSpinner(SpinnerModel)

Métodos commitEdit() createEditor(SpinnerModel)

Eventos: ChangeEvent

Page 92: Curso de Swing

SpinnerModel

Propiedades: value, nextValue, previousValue

Evento: ChangeEvent

SpinnerModel

AbstractSpinnerModel

SpinnerDateModel SpinnerListModel SpinnerNumberModel

Page 93: Curso de Swing

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

Page 94: Curso de Swing

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

Page 95: Curso de Swing

Contenedores

Page 96: Curso de Swing

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

Page 97: Curso de Swing

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

Page 98: Curso de Swing

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)

Page 99: Curso de Swing

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

Page 100: Curso de Swing

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

Page 101: Curso de Swing

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

Page 102: Curso de Swing

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)

Page 103: Curso de Swing

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

Page 104: Curso de Swing

Applets

Page 105: Curso de Swing

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

Page 106: Curso de Swing

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

Page 107: Curso de Swing

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

}

}

Page 108: Curso de Swing

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>

Page 109: Curso de Swing

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>

Page 110: Curso de Swing

HtmlConverter

La utilidad HtmlConverter sustituye las etiquetas <APPLET> por las correspondientes <OBJECT>

Page 111: Curso de Swing

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

Page 112: Curso de Swing

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

}

}

Page 113: Curso de Swing

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

}

Page 114: Curso de Swing

MDI (Frames internos)

Page 115: Curso de Swing

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

Page 116: Curso de Swing

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

Page 117: Curso de Swing

JDesktopPane

Propiedades: allFrames, selectedFrame desktopManager dragMode

Métodos getAllFramesInLayer(i) updateUI()

Page 118: Curso de Swing

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)

Page 119: Curso de Swing

Diálogos

Page 120: Curso de Swing

JDialog

Es un frame que puede ser modal Tiene las misma estructura de

JFrame Añade la propiedad modal

Page 121: Curso de Swing

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

Page 122: Curso de Swing

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

Page 123: Curso de Swing

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

Page 124: Curso de Swing

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

Page 125: Curso de Swing

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

Page 126: Curso de Swing

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

Page 127: Curso de Swing

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

Page 128: Curso de Swing

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

Page 129: Curso de Swing

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)

Page 130: Curso de Swing

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)

Page 131: Curso de Swing

Menús y toolbars

Page 132: Curso de Swing

Menús

Los elementos de menú son muy configurables Iconos Radio buttons Check box Teclas rápidas Elementos de menú propios

Page 133: Curso de Swing

Jerarquía de menús

JComponent

AbstractButton

JMenuItem

JPopUpMenuJMenuBar

JCheckBoxMenuItem JMenu JRadioButtonMenuItem

MenuElement

Page 134: Curso de Swing

Estructura del menú

Barra de menú(JMenuBar)

Menú(JMenu)

Submenú(JMenu)

Separador(JSeparator)

Elementos de menú(JMenuItem)

Menú pop-up(JPopupMenu)

Page 135: Curso de Swing

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

Page 136: Curso de Swing

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)

Page 137: Curso de Swing

SingleSelectionModel

Sólo puede haber seleccionado un único elemento de menú

Propiedades selected selectedIndex

Implementado por DefaultSingleSelectionModel

Page 138: Curso de Swing

JMenuItem Representa un elemento de menú Propiedades

text, image, action accelerator, mnemonic armed, enabled horizontalAlignment, verticalAlignment horizontalTextPosition, verticalTextPosition subElements

Eventos ActionEvent, ChangeEvent MenuDragMouseEvent, MenuKeyEvent

Page 139: Curso de Swing

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

Page 140: Curso de Swing

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

Page 141: Curso de Swing

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

Page 142: Curso de Swing

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

Page 143: Curso de Swing

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

Page 144: Curso de Swing

Tablas

Page 145: Curso de Swing

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

Page 146: Curso de Swing

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

Page 147: Curso de Swing

JTable: propiedades

Propiedades de selección: cellSelectionEnabled columnSelectionAllowed rowSelectionAllowed selectedColumn, selectedColumns, selectedColumnCount

selectedRow, selectedRows, selectedRowCount

selectionMode selectionModel

Page 148: Curso de Swing

JTable: propiedades

Otras propiedades: tableHeader cellEditor dragEnabled gridColor, selectionBackground, selectionForeground

showGrid, showHorizontalLines, showVerticalLines

interCellSpacing, rowMargin

Page 149: Curso de Swing

JTable: constructores

JTable() JTable(TableModel) JTable(TableModel,

TableColumnModel) JTable(TableModel,

TableColumnModel, ListSelectionModel)

JTable(nRows,nCols) JTable(data, columnNames)

Page 150: Curso de Swing

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)

Page 151: Curso de Swing

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

Page 152: Curso de Swing

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)

Page 153: Curso de Swing

TableModel

Contiene los datos de la tabla Propiedades:

columnCount, rowCount Métodos:

getValueAt(row,col) isCellEditable(row,col) setValueAt(valor,row,col)

Page 154: Curso de Swing

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

Page 155: Curso de Swing

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)

Page 156: Curso de Swing

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)

Page 157: Curso de Swing

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

Page 158: Curso de Swing

Árboles

Page 159: Curso de Swing

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

Page 160: Curso de Swing

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)

Page 161: Curso de Swing

DefaultTreeModel

Añade los métodos: getPathToRoot(nodo) insertNodeInto(hijo,padre,index) removeNodeFromParent(nodo) reload(), reload(nodo)

Page 162: Curso de Swing

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

Page 163: Curso de Swing

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

Page 164: Curso de Swing

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

Page 165: Curso de Swing

TreePath

Representa un conjunto de nodos en descendencia

Propiedades: path, pathCount pathComponent(i) parentPath, lastPathComponent()

Métodos: isDescendant(path) pathByAddingChild(nodo)

Page 166: Curso de Swing

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)

Page 167: Curso de Swing

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[])

Page 168: Curso de Swing

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)

Page 169: Curso de Swing

JTree

Eventos: TreeModelEvent TreeSelectionEvent TreeExpansionEvent

TreeExpansionListener y TreeWillExpandListener

Page 170: Curso de Swing

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

Page 171: Curso de Swing

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

Page 172: Curso de Swing

Drag & Drop

Page 173: Curso de Swing

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

Page 174: Curso de Swing

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)

Page 175: Curso de Swing

Transferable

Encapsulan los datos que se transfieren

Métodos: getTransferData(DataFlavor) getTransferDataFlavors() isDataFlavorSupported(DataFlavor)

Para strings, usar la clase StringSelection

Page 176: Curso de Swing

Tipos de objeto (DataFlavor)

stringFlavor imageFlavor javaSerializedObjectMimeType javaFileListFlavor javaJVMLocalObjectMimeType javaRemoteObjectMimeType Propios:

new DataFlavor(Class, nombre); La clase debe implementar Serializable

Page 177: Curso de Swing

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

Page 178: Curso de Swing

DropTarget

Encapsula el comportamiento de un destino de drop

Propiedades: component, dropTargetContext active, defaultActions, flavorMap

Eventos: DropTargetEvent

Contructor: DropTarget(Component,

DropTargetListener)

Page 179: Curso de Swing

DropTargetListener

Métodos: dragEnter(DropTargetDragEvent) dragExit(DropTargetEvent) dragOver(DropTargetDragEvent) drop(DropTargetDropEvent) dropActionChanged(DropTargetDragE

vent)

Page 180: Curso de Swing

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)

Page 181: Curso de Swing

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)

Page 182: Curso de Swing

DragGestureRecognizer

Monitoriza un control y detecta inicios de arrastre

Propiedades: component, dragSource sourceActions, triggerEvent

Eventos: DragGestureEvent

Se crea desde el DragSource

Page 183: Curso de Swing

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

Page 184: Curso de Swing

Gráficos 2D

Page 185: Curso de Swing

Impresión

Page 186: Curso de Swing

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)