Your SlideShare is downloading. ×
0
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Curso de Swing
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Curso de Swing

51,955

Published on

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

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

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
51,955
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
116
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. SwingJorge Guilló – jguillo@gmail.com
  • 2. Contenido Introducción  Contenedores  AWT  Applets  Swing  MDI  Primer programa Swing  Diálogos Arquitectura básica  JOptionPane  JFrame  JFileChooser / JColorChooser  JComponent  Menús y Barras de  Layouts herramientas  Eventos  Acciones Controles básicos  Tablas  Etiquetas e Iconos  Árboles  Cajas de texto  Drag & Drop  Botones  Barras de desplazamiento  Gráficos 2D  Barras de progreso  Impresión  Listas
  • 3. Introducción a Swing Origen y arquitectura
  • 4. 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
  • 5. 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)
  • 6. Java Foundation Classes Java Foundation Classes Drag Java AWT Swing Accesibilidad & 2D Drop
  • 7. 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
  • 8. Primer programa Swingimport javax.swing.*; import javax.swing.*;public class MiFrame extends JFrame { public class MiFrame extends JFrame { public MiFrame() { public MiFrame() {this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JLabel lbl = new JLabel("Hola a todos"); JLabel lbl = new JLabel("Hola a todos"); this.getContentPane().add(lbl); this.getContentPane().add(lbl); this.pack(); this.pack(); }} public static void main(String[] args) { public static void main(String[] args) { MiFrame frm = new MiFrame(); MiFrame frm = new MiFrame(); frm.setVisible(true); frm.setVisible(true); }}}}
  • 9. Implementación óptima... ... private static void iniciarGUI() { private static void iniciarGUI() { MiFrame frm = new MiFrame(); MiFrame frm = new MiFrame(); frm.setVisible(true); frm.setVisible(true); }} public static void main(String[] args) { public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater( javax.swing.SwingUtilities.invokeLater( new Runnable() { new Runnable() { public void run() { public void run() { iniciarGUI(); iniciarGUI(); }} }); }); }}... ...
  • 10. Arquitectura de Swing
  • 11. 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
  • 12. 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
  • 13. 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)
  • 14. 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ódigo SwingUtilities.invokeLater( new Runnable() { public void run() {...} });
  • 15. Jerarquía de clases Swing ja v a . a w t. C o m p o n e n t ja v a .a w t . C o n ta in e r JC om ponent ja v a .a w t . P a n e l ja v a . a p p le t. A p p le tJLabel J T e x tC o m p o n e n t A b s tra c tB u tto n J R o o tP a n e J S e p a ra to rJ L is t JP anel J T o o lT ip J A p p le t J T e x t F i e ld J T o g g le B u t t o nJC om boB ox J S c r o llP a n e J T a b le ja v a . a w t . W in d o wJ S c r o llB a r J P a s s w o r d F i e ld JC heckB ox J S p l it P a n e J T re e J W in d o wJ P ro g re s s B a r J F o r m a t t e d T e x t F i e ld J R a d io B u t t o n JTabbedPane J V ie w P o rt ja v a .a w t . D ia lo gJ S lid e r J T e x tA re a J B u tto n J L a y e re d P a n e J O p tio n P a n eJ S p in n e r J E d it o r P a n e J M e n u Ite m J F ile C h o o s e r J D ia lo g J D e s k to p P a n eJ T o o lB a r J C o lo r C h o o s e r ja v a .a w t . F r a m e J T e x tP a n e JM enu J I n t e r n a lF r a m eJM enuB ar J R a d io B u t to n M e n u I t e m J F ra m eJP opupM enu J C h e c k B u tto n M e n u Ite m
  • 16. 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
  • 17. Estructura de un JFrame JFrame JRootPane JPanel JLayeredPane (Glass Pane) JPanel JMenuBar (Content Pane) Controles
  • 18. Estructura de un JFrame
  • 19. 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
  • 20. JComponent: Propiedades background  locale border  location colorModel  locationOnScreen components  name cursor  parent enabled  size font  showing foreground  toolTipText insets  valid layout  visible
  • 21. 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.
  • 22. 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
  • 23. 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
  • 24. 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
  • 25. 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
  • 26. 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
  • 27. 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)
  • 28. 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
  • 29. 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()
  • 30. 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
  • 31. 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
  • 32. Combinar layouts  Normalmente, una ventana se compone de varios paneles cada uno con el layout más apropiado BoxLayout Opción 1 Opción 2BorderLayout GridLayout Opción 3 Opción 4 FlowLayout Aceptar Cancelar
  • 33. Practica Layouts Crear una calculadora
  • 34. 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
  • 35. 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
  • 36. 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
  • 37. 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
  • 38. 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
  • 39. 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" ); JFrame ventana = new JFrame( "Prueba de eventos" );ventana.addWindowListener( new WindowAdapter() { ventana.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent evt ){ public void windowClosing( WindowEvent evt ){ System.exit( 0 ); System.exit( 0 ); }} } ); } );
  • 40. 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)
  • 41. Controles básicos
  • 42. Etiquetas Objetos JLabel Las etiquetas pueden tener texto y/o icono Propiedades:  text  icon / disabledIcon  horizontalAlignment / verticalAlignment  horizontalTextPosition / verticalTextPosition  iconTextGap  labelFor  displayedMnemonic / displayedMnemonicIndex
  • 43. 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>" );
  • 44. 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
  • 45. 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)
  • 46. 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
  • 47. 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)
  • 48. 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
  • 49. 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
  • 50. JTextField Propiedades:  action  columns  horizontalAlignment  horizontalVisibility Eventos:  ActionEvent JPasswordField  Propiedades:  echoChar, getPassword()
  • 51. 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)
  • 52. Practica controles básicos Formulario de entrada de datos Nombre CheckBox Mayor de edad  NIF  Estado civil  Botones de opcion (Soltero, casado, viudo,...)
  • 53. JFormattedTextField Propiedades:  formatter, formatterFactory  editValid  value Métodos:  commitEdit()
  • 54. 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
  • 55. 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
  • 56. 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
  • 57. 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
  • 58. Practica texto con formato Añadir al formulario de entrada de datos un campo cuenta bancaria XXXX-XXXX-XX-XXXXXXXXXX
  • 59. 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)
  • 60. 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()
  • 61. 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
  • 62. 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)
  • 63. 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);
  • 64. Practica KeyMaps
  • 65. 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
  • 66. 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
  • 67. 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
  • 68. 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
  • 69. Práctica Slider Dialogo de selección de color
  • 70. 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
  • 71. 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
  • 72. 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();
  • 73. 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
  • 74. 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
  • 75. 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()
  • 76. Práctica ProgressMonitor Modificar la práctica anterior para abrir el fichero con un ProgressMonitorInputStream
  • 77. 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
  • 78. 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
  • 79. 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
  • 80. 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
  • 81. 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
  • 82. 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
  • 83. 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.
  • 84. 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)
  • 85. 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
  • 86. DefaultComboBoxModel ListModel ComboBoxModel selectedItem MutableComboBoxModel AbstractListModel addElement, removeElement, ... Implementa ListDataEvent DefaultComboBoxModel DefaultComboBoxModel
  • 87. 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
  • 88. 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
  • 89. Practica ListCellRenderer Añadir a la lista de fuentes un renderer que muestre el nombre de la fuente utilizando la propia fuente
  • 90. 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,...)
  • 91. JSpinner Propiedades:  editor, model, value  nextValue, previousValue Constructores:  JSpinner(SpinnerModel) Métodos  commitEdit()  createEditor(SpinnerModel) Eventos:  ChangeEvent
  • 92. SpinnerModel  Propiedades:  value, nextValue, previousValue  Evento:  ChangeEvent SpinnerModel AbstractSpinnerModelSpinnerDateModel SpinnerListModel SpinnerNumberModel
  • 93. 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
  • 94. 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
  • 95. Contenedores
  • 96. 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
  • 97. 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
  • 98. 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)
  • 99. 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 Esquina Esquina Cabecera de columna Cabecera Barra ViewPort de fila vertical Barra horizontal Esquina Esquina
  • 100. 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_CORNER UPPER_LEFT_CORNER, UPPER_RIGHT_CORNER
  • 101. 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
  • 102. 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)
  • 103. 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
  • 104. Applets
  • 105. 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
  • 106. 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
  • 107. Mi primer Applet!import javax.swing.*; import javax.swing.*;import java.awt.*; import java.awt.*;public class MiApplet extends JApplet { public class MiApplet extends JApplet { public void init() { public void init() { JLabel label = new JLabel label = newJLabel("Applet!"); JLabel("Applet!"); getContentPane().add(label); getContentPane().add(label); }}}}
  • 108. 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 code="MiApplet" width=100 height=50> </applet> </applet>
  • 109. Ejecutar el applet:En un navegador  Ahora, ya no tanto:<OBJECT <OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" width="100" height="50" align="baseline" width="100" height="50" align="baseline" codebase="http://java.sun.com/products/plugin/1.2.2/jinstall- codebase="http://java.sun.com/products/plugin/1.2.2/jinstall- 1_2_2-win.cab#Version=1,2,2,0"> 1_2_2-win.cab#Version=1,2,2,0"> <PARAM NAME="code" VALUE="MiApplet.class"> <PARAM NAME="code" VALUE="MiApplet.class"> <PARAM NAME="codebase" VALUE="."> <PARAM NAME="codebase" VALUE="."> <PARAM NAME="type" VALUE="application/x-java-applet;version=1.2.2"> <PARAM NAME="type" VALUE="application/x-java-applet;version=1.2.2"> <COMMENT> <COMMENT> <EMBED type="application/x-java-applet;version=1.2.2" <EMBED type="application/x-java-applet;version=1.2.2" width="100" height="50" align="baseline" width="100" height="50" align="baseline" code="MiApplet.class" codebase="." code="MiApplet.class" codebase="."pluginspage="http://java.sun.com/products/plugin/1.2/plugin-install.html" pluginspage="http://java.sun.com/products/plugin/1.2/plugin-install.html" <NOEMBED> <NOEMBED> No soporta applets Java 2! No soporta applets Java 2! </NOEMBD> </NOEMBD> </EMBED> </EMBED> </COMMENT> </COMMENT></OBJECT> </OBJECT>
  • 110. HtmlConverter La utilidad HtmlConverter sustituye las etiquetas <APPLET> por las correspondientes <OBJECT>
  • 111. 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
  • 112. Ejecutar el applet:AppletViewer// Etiqueta para appletviewer // Etiqueta para appletviewer// <applet code="MiApplet" width=100 height=50> // <applet code="MiApplet" width=100 height=50>// </applet> // </applet>import javax.swing.*; import javax.swing.*;import java.awt.*; import java.awt.*;public class MiApplet extends JApplet { public class MiApplet extends JApplet { public void init() { public void init() { JLabel label = new JLabel("Applet!"); JLabel label = new JLabel("Applet!"); getContentPane().add(label); getContentPane().add(label); }}}} Se ejecuta: appletviewer MiApplet.java (hay que compilar primero)
  • 113. 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) { public static void main(String[] args) { JApplet applet = new MiApplet(); JApplet applet = new MiApplet(); JFrame frame = new JFrame("MiApplet"); JFrame frame = new JFrame("MiApplet");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(applet); frame.getContentPane().add(applet); frame.setSize(100,50); frame.setSize(100,50); applet.init(); applet.init(); applet.start(); applet.start(); frame.setVisible(true); frame.setVisible(true);}
  • 114. MDI (Frames internos)
  • 115. 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
  • 116. 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()
  • 117. JDesktopPane Propiedades:  allFrames, selectedFrame  desktopManager  dragMode Métodos  getAllFramesInLayer(i)  updateUI()
  • 118. 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)
  • 119. Diálogos
  • 120. JDialog Es un frame que puede ser modal Tiene las misma estructura de JFrame Añade la propiedad modal
  • 121. JOptionPane Se utiliza para crear diálogos típicos  Icono  Área de mensaje  Área de introducción de datos  Botones de opción X Título Mensaje Icono Input Botón 1 Botón 2
  • 122. 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()
  • 123. 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
  • 124. 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()
  • 125. 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()
  • 126. 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
  • 127. 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
  • 128. 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
  • 129. 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)
  • 130. 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)
  • 131. Menús y toolbars
  • 132. Menús Los elementos de menú son muy configurables  Iconos  Radio buttons  Check box  Teclas rápidas  Elementos de menú propios
  • 133. Jerarquía de menús JComponent AbstractButton JMenuBar JPopUpMenu JMenuItem MenuElementJCheckBoxMenuItem JMenu JRadioButtonMenuItem
  • 134. Estructura del menúMenú Barra de menú(JMenu) (JMenuBar)Separador(JSeparator) Elementos de menú (JMenuItem)Submenú(JMenu) Menú pop-up (JPopupMenu)
  • 135. Añadir un menú a un frame// Crear barra de menú // Crear barra de menúJMenuBar menuBar = new JMenuBar(); JMenuBar menuBar = new JMenuBar();// Crear menú // Crear menúJMenu menu = new JMenu("Archivo"); JMenu menu = new JMenu("Archivo");// Crear elementos de menú // Crear elementos de menúJMenuItem salir = new JMenuItem("Salir"); JMenuItem salir = new JMenuItem("Salir");salir.addActionListener(salirListener); salir.addActionListener(salirListener);// Añadir elementos al menú // Añadir elementos al menúmenu.add(salir); menu.add(salir);// Añadir el menú a la barra // Añadir el menú a la barramenuBar.add(menu); menuBar.add(menu);// Añadir la barra al frame // Añadir la barra al frameframe.setJMenuBar(menuBar); frame.setJMenuBar(menuBar);
  • 136. 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)
  • 137. SingleSelectionModel Sólo puede haber seleccionado un único elemento de menú Propiedades  selected  selectedIndex Implementado por DefaultSingleSelectionModel
  • 138. JMenuItem Representa un elemento de menú Propiedades  text, image, action  accelerator, mnemonic  armed, enabled  horizontalAlignment, verticalAlignment  horizontalTextPosition, verticalTextPosition  subElements Eventos  ActionEvent, ChangeEvent  MenuDragMouseEvent, MenuKeyEvent
  • 139. 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
  • 140. 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
  • 141. 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
  • 142. 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
  • 143. 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()
  • 144. Tablas
  • 145. 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
  • 146. 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
  • 147. JTable: propiedades Propiedades de selección:  cellSelectionEnabled  columnSelectionAllowed  rowSelectionAllowed  selectedColumn, selectedColumns, selectedColumnCount  selectedRow, selectedRows, selectedRowCount  selectionMode  selectionModel
  • 148. JTable: propiedades Otras propiedades:  tableHeader  cellEditor  dragEnabled  gridColor, selectionBackground, selectionForeground  showGrid, showHorizontalLines, showVerticalLines  interCellSpacing, rowMargin
  • 149. JTable: constructores JTable() JTable(TableModel) JTable(TableModel, TableColumnModel) JTable(TableModel, TableColumnModel, ListSelectionModel) JTable(nRows,nCols) JTable(data, columnNames)
  • 150. 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)
  • 151. 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
  • 152. 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)
  • 153. TableModel Contiene los datos de la tabla Propiedades:  columnCount, rowCount Métodos:  getValueAt(row,col)  isCellEditable(row,col)  setValueAt(valor,row,col)
  • 154. 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
  • 155. 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 
  • 156. 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)
  • 157. 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
  • 158. Árboles
  • 159. 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
  • 160. 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)
  • 161. DefaultTreeModel Añade los métodos:  getPathToRoot(nodo)  insertNodeInto(hijo,padre,index)  removeNodeFromParent(nodo)  reload(), reload(nodo)
  • 162. 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()
  • 163. 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()
  • 164. 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()
  • 165. TreePath Representa un conjunto de nodos en descendencia Propiedades:  path, pathCount  pathComponent(i)  parentPath, lastPathComponent() Métodos:  isDescendant(path)  pathByAddingChild(nodo)
  • 166. 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)
  • 167. 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[])
  • 168. 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)
  • 169. JTree Eventos:  TreeModelEvent  TreeSelectionEvent  TreeExpansionEvent  TreeExpansionListener y TreeWillExpandListener
  • 170. 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
  • 171. 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...
  • 172. Drag & Drop
  • 173. 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
  • 174. 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)
  • 175. Transferable Encapsulan los datos que se transfieren Métodos:  getTransferData(DataFlavor)  getTransferDataFlavors()  isDataFlavorSupported(DataFlavor) Para strings, usar la clase StringSelection
  • 176. Tipos de objeto (DataFlavor) stringFlavor imageFlavor javaSerializedObjectMimeType javaFileListFlavor javaJVMLocalObjectMimeType javaRemoteObjectMimeType Propios:  new DataFlavor(Class, nombre);  La clase debe implementar Serializable
  • 177. 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
  • 178. DropTarget Encapsula el comportamiento de un destino de drop Propiedades:  component, dropTargetContext  active, defaultActions, flavorMap Eventos:  DropTargetEvent Contructor:  DropTarget(Component, DropTargetListener)
  • 179. DropTargetListener Métodos:  dragEnter(DropTargetDragEvent)  dragExit(DropTargetEvent)  dragOver(DropTargetDragEvent)  drop(DropTargetDropEvent)  dropActionChanged(DropTargetDragEvent )
  • 180. Eventos Drop DropTargetEvent  DropTargetDropEvent  Propiedades:  Propiedades:  dropTargetContext  currentDataFlavors  currentDataFlavorsAsList DropTargetDragEvent  dropAction  Propiedades:  localTransfer  currentDataFlavors  location  currentDataFlavorsAsList  sourceActions  dropAction  transferable  location  Métodos  sourceActions  acceptDrop(dropAction)  rejectDrop()  Métodos  dropComplete(ok)  acceptDrag(dragOperation)  isDataFlavorSupported(df)  rejectDrag()
  • 181. 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)
  • 182. DragGestureRecognizer Monitoriza un control y detecta inicios de arrastre Propiedades:  component, dragSource  sourceActions, triggerEvent Eventos:  DragGestureEvent Se crea desde el DragSource
  • 183. 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);
  • 184. Gráficos 2D
  • 185. Impresión
  • 186. 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 (OReilly)  Java AWT Reference (descatalogado)  John Zukowski (OReilly)

×