Contextualización y aproximación al objeto de estudio de investigación cualit...
Componentes Swing y contenedores
1. 7. Profundizando en Swing
Componentes y contenedores de Swing
Un vistazo a algunos de los más usados
Modelos de datos
Look & feel
Dibujando en Java
Hilo de Swing
Programación III Tema 7b - Swing
2. Componentes Swing (1)
• Una buena referencia: Java Tutorials
• Veamos algunos de los componentes más significativos
– Controles básicos
Programación III Tema 7b - Swing
3. Componentes Swing (2)
• Edición
con
formato
específico
Programación III Tema 7b - Swing
4. Componentes Swing (3)
• Muestra de información no editable
Programación III Tema 7b - Swing
5. Contenedores Swing (1)
• Contenedores de primer nivel (top-level)
Programación III Tema 7b - Swing
7. Descripción de
componentes
• Hacemos un recorrido por algunos de los
componentes más útiles de Swing
• Usar cada uno requiere consultar la
documentación para:
– Tipo de uso (¿es lo que necesitamos?)
– Modo de construirlo
– Modo de configurarlo
– Modo de utilizarlo en nuestro código
• Cómo consultar sus datos
• Cómo modificar sus datos
• Cómo operar con él (eventos)
Programación III Tema 7b - Swing
8. Características generales
• Algunos métodos comunes a componentes:
– setVisible( bool )
– setEnabled( bool )
– getParent() - contenedor donde está
– isFocusOwner() - tiene el foco?
• transferFocus(), requestFocusInWindow()
– setPreferredSize( tam ), ...Minimum, ...Maximum
– setFont, setBackground, setForeground
– setTooltipText( texto )
– setBorder( ... ) - veamos los bordes...
Programación III Tema 7b - Swing
9. Características gen.: Borde
• Hay varios tipos de borde
– Generador en BorderFactory
– Se pueden componer
BorderFactory.createMatteBorder(
2, 5, 2, 5, Color.green );
BorderFactory.createBevelBorder( BevelBorder.RAISED );
BorderFactory.createEtchedBorder();
BorderFactory.createLineBorder( Color.red );
BorderFactory.createLoweredBevelBorder();
BorderFactory.createRaisedBevelBorder();
BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder("N. panel"),
BorderFactory.createEmptyBorder(5,5,5,5) );
Programación III Tema 7b - Swing
10. JButton
• Puede mostrar texto y/o imagen
• Algunos métodos:
– setMnemonic( KeyEvent.VK_M )
– setActionCommand( texto ) - para el listener
• getActionCommand() (en el evento)
– setDefaultButton( b ) (en el contenedor raíz)
– doClick() (click programático)
• Iconos configurables para estados:
– desactivado, pulsado, rollover
• ActionListener
Programación III Tema 7b - Swing
11. JCheckBox / JRadioButton
• JCheckBox
– Como un botón pero con estado
(activado o no)
• setSelected( bool )
• getSelected()
– ItemListener - cambio de estado
• JRadioButton
– Se agrupan en un ButtonGroup
• bg.add( rb )
– Sólo uno está activo
– ActionListener - cambio de botón activo
Programación III Tema 7b - Swing
13. Texto con formato/estilo
• JFormattedTextField
– Cuadros de texto
– Estilo fijo (patrones)
• Dos comps. similares
– JEditorPane
• Muestra texto HTML
• También RTF
– JTextPane
• Permite estilos
• Integra imágenes
– Sin necesidad de formato HTML o RTF
Programación III Tema 7b - Swing
14. JComboBox
• Dos modos de uso:
– Sin edición
– Con edición (línea)
• Se despliega
– Al construir se le pasan los datos a elegir
– Algunos métodos:
• setEditable( true/false )
• setSelectedIndex( num. elemento ) - ...Item
• getSelectedItem() - ...Index()
– ActionListener - selección (<Enter> en editable)
– ItemListener - cambio de selección
Programación III Tema 7b - Swing
15. JList
• Sólo de consulta/selección
– Presentan elementos para elegir
– Selección simple o múltiple
– Algunos métodos:
• setLayoutOrientation - una o varias columnas
• setSelectionMode - modo de selección
• setSelectedItem( ... ) - ...Index - ...Indices
• getSelectedIndices() - ...Value() - ...Values()
• ensureIndexIsVisible( ... )
• isSelectionEmpty(), clearSelection()
– ListSelectionListener
Programación III Tema 7b - Swing
16. JSpinner
• Como un combo sin desplegar
• Modelos de datos por defecto:
– Lista de valores
– Rango de números
– Fechas
• ChangeListener - cambio de valor
Programación III Tema 7b - Swing
17. JTable
• Componente complejo
– muy potente
– Filas y columnas
– Celdas configurables en visualización y edición
– Anchuras de columnas configurables
– Selección de celda, rangos o filas/columnas
– Permite ordenación, filtrado y búsqueda
– Usa un modelo de datos de tabla
• TableModelListener - cambio de datos
Programación III Tema 7b - Swing
18. Modelos de datos (1)
• Muchos de los componentes Swing utilizan
modelos de datos:
– JComboBox, JList, JSpinner, JTable...
• Se crea un modelo, por defecto o partiendo
de una EEDD existente
– new DefaultListModel()
• Se puede modificar el modelo si procede
– setModel( modelo )
Programación III Tema 7b - Swing
19. Modelos de datos (2)
• Se puede manipular para cambiar los datos
– modelo.addElement( elemento )
– modelo.remove( índice )
• Se pueden crear modelos ad-hoc
extendiendo y redefiniendo métodos
– TableModel
• getValueAt( fila, columna )
• setValueAt( objeto, fila, columna )
• isCellEditable( fila, columna )
• ...
Programación III Tema 7b - Swing
20. Otros componentes
• JProgressBar
– Indica el progreso de alguna tarea
• new JProgressBar( min, max )
• setValue( val )
• setStringPainted( true/false ) - muestra %
• setIndeterminate( true/false )
• JSpinner
– Entrada de valor numérico
entre un mínimo y máximo dados
– ChangeListener - cambio de valor
Programación III Tema 7b - Swing
21. Personalización de comps.
• La mayor parte de los componentes se
pueden personalizar para comportarse
diferente
– Lo que visualizan - Renderer. Ej:
JComboBox cb = new JComboBox( misDatos );
...
ComboBoxRenderer renderer = new ComboBoxRenderer();
petList.setRenderer(cb);
– Cómo son editadas - Editor. Ej:
table.setDefaultEditor( Integer.class,
new IntegerEditor(0, 100));
Programación III Tema 7b - Swing
22. Menús
• Java permite menús desplegables
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("A Menu");
menu.setMnemonic(KeyEvent.VK_A);
menuBar.add(menu);
JMenuItem menuItem = new JMenuItem(
"A text-only menu item", KeyEvent.VK_T);
menuItem.setAccelerator( KeyStroke.getKeyStroke(
KeyEvent.VK_1, ActionEvent.ALT_MASK ));
menu.add(menuItem);
menuItem = new JMenuItem("Both text and icon",
new ImageIcon("images/middle.gif"));
menuItem.setMnemonic(KeyEvent.VK_B);
menu.add(menuItem);
Programación III Tema 7b - Swing
23. Menús (2)
menuItem = new JMenuItem(
new ImageIcon("images/middle.gif"));
menu.add(menuItem);
menu.addSeparator();
ButtonGroup group = new ButtonGroup();
rbMenuItem = new JRadioButtonMenuItem(
"A radio button menu item" );
rbMenuItem.setSelected(true);
group.add(rbMenuItem);
menu.add(rbMenuItem);
rbMenuItem = new JRadioButtonMenuItem("Another
one");
group.add(rbMenuItem);
menu.add(rbMenuItem);
...
vent.setJMenuBar(menuBar); 7b - Swing
Programación III Tema
24. Menús (3)
• Los eventos son ActionEvent
– Se chequean como los botones
– ItemEvent si es una opción de checkbox
menuItem.addActionListener(this);
...
public void actionPerformed(ActionEvent e) {
if (e.getAction().equals( ... ))
...
else if (e == menuItemXXX)
...
}
Programación III Tema 7b - Swing
25. Descripción de
contenedores
• Comentamos ahora algunos de los
contenedores más significativos
– JScrollPane
• Permite scroll sobre un componente
más grande que el área disponible
• Configurable horizontal / vertical
• Vale para texto y para imágenes
• Se construye con el componente
• Típico en JTextArea, JList, JTree, JTable...
JScrollPane areaScrollPane = new JScrollPane( textArea );
areaScrollPane.setVerticalScrollBarPolicy(
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
Programación III Tema 7b - Swing
26. Combinando varios paneles
• JSplitPane
– Panel móvil entre dos
• horizontal o vertical
• % mínimo o máximo
• JTabbedPane
– "n" paneles, uno visible
– Pestañas para cada uno
• JToolBar
– Horizontal o vertical
– "Draggable"
Programación III Tema 7b - Swing
27. Contenedores de primer
nivel
• JFrame
– La ventana que conocemos. Proceso adecuado:
JFrame frame = new JFrame("ventana"); // Crearla
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Operación a hacer en cierre
// Mejor DISPOSE_ON_CLOSE (sólo cierra esta v)
frame.getContentPane().add( ... ); // Añadir comp
...
frame.pack(); // Ajustar a tamaño adecuado
// Alternativa: setSize( ... );
frame.setLocationRelativeTo(null);
// Posiciona en pantalla (centra)
frame.setVisible(true); // Mostrarla
...
frame.dispose(); // La finaliza por programa
Programación III Tema 7b - Swing
28. JDialog / JOptionPane
• Ventana dependiente de un JFrame
– Si es modal, bloquea el resto de ventanas
– Hay una utilidad ya creada en Java:
JOptionPane.showMessageDialog(
framePrincipal,
"Fichero guardado.");
– También eligiendo:
Object[]ops = {"Sí","No","Cancelar" };
JOptionPane.showOptionDialog( f,
"¿Confirmar?", "Borrado",
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE, null,
ops, ops[0]);
Programación III Tema 7b - Swing
29. JOptionPane (2)
• Hay cuatro métodos principales:
– showMessageDialog - sólo mensaje
– showConfirmDialog - mensaje con
confirmación, usando botones
– showInputDialog - pide información, texto o
lista de opciones
– showOptionDialog - los tres unidos
• showInternal... - para internalFrames
Programación III Tema 7b - Swing
30. Internal Frames
• Si queremos una sola ventana principal
– Con el resto de ventanas incluidas en ella
– Solución: JInternalFrame
• Panel principal: JDesktopPane
desktop = new JDesktopPane();
setContentPane(desktop);
• Ventanas subordinadas
JInternalFrame v = new JInternalFrame();
v.setSize( 200, 150 );
v.setLocation( 50, 50 );
v.setVisible(true);
desktop.add( v );
v.setSelected(true);
Programación III Tema 7b - Swing
31. Contenedores con capas
• Paneles con dimensión Z
– Información de profundidad
– Transparencia opcional
• JLayeredPane - capa inferior
– Se añaden con un Integer
• profundidad (> - al frente)
panelCapas.add( comp1, new Integer(1));
panelCapas.add( comp2, new Integer(2));
...
panelCapas.setLayer(comp,prof,posicion); // 2 niveles
panelCapas.moveToFront( comp );
panelCapas.moveToBack( comp );
Programación III Tema 7b - Swing
32. Orden de pans.
contenedores
• JRootPane - fondo
– Panel con capas si existe
– Panel de contenido (el normal de ventanas)
– Panel cristal (por omisión oculto)
• Se ve por encima del resto / transparente
• Pero sí intercepta los eventos de ratón si está activado
Programación III Tema 7b - Swing
33. Look & Feel
– Java permite configurar el L&F
• UIManager.setLookAndFeel( nombre clase );
– Clases de l&F:
• UIManager.getSystemLookAndFeelClassName()
• "javax.swing.plaf.metal.MetalLookAndFeel"
• "com.sun.java.swing.plaf.windows.WindowsLookAndFeel"
• "com.sun.java.swing.plaf.motif.MotifLookAndFeel"
• "com.sun.java.swing.plaf.gtk.GTKLookAndFeel"
– También una vez iniciadas las ventanas:
• SwingUtilities.updateComponentTreeUI( ventana );
• ventana.pack();
– Se puede tb por línea de comandos
– Se pueden crear l&f personalizados
Programación III Tema 7b - Swing
34. Ejemplo
• SwingSet2
– Incluido en demos de JDK (demos/jfc)
– Muestra muchas de las posibilidades de Swing
• SwingSet3 en evolución (Web)
– Nuevo L&F de Java 10: Nimbus
Programación III Tema 7b - Swing
35. Dibujo en Swing: a su
manera
• Swing dibuja los componentes según layout
– Con layout nulo podemos ponerlos nosotros
• setLocation( x, y )
• setBounds( new Rectangle( ancho, alto ) )
– Al ir moviendo el componente Swing lo redibuja
• Pueden solaparse (swing dibuja en orden de add)
– El add puede hacerse indicando posición
– Mejor usar LayeredPane si la profundidad es importante
• Ejemplo: EjemploJuego.java
Programación III Tema 7b - Swing
36. Dibujo en Swing a nuestra
manera (1)
• Swing hace lo siguiente para "pintar" la
ventana con todos sus componentes:
– Llama al método paint(Graphics g)
• Este llama al paint(g) de todos sus componentes
– Cada paint de un componente hace 3 pasos:
• paintComponent(g)
• paintBorder(g)
• paintChildren(g)
– El método a sobreescribir:
paintComponent(g)
• Debe llamar a super.paintComponent(g)
– Esto incluye el pintado del fondo
Programación III Tema 7b - Swing
37. Dibujo en Swing a nuestra
manera (2)
• ¿Cuándo "pinta" Swing?
– Cuando lo necesita
• Al redimensionar la ventana
• Al mostrarse/ocultarse componentes
• Al cambiar valores de componentes (p ej setLocation)
– Cuando el programador quiera
• Llamando a repaint() - redibuja todo
• Llamando a repaint( x,y,ancho,alto ) - redibuja parte
• Swing "guarda" la llamada y pinta en cuanto puede
Ejemplo: PruebaDibujadoSwing
(cambio paintComponent(g))
Programación III Tema 7b - Swing
38. Otros aspectos
• java.awt.Desktop
– browse(URI uri) - navegador asociado en el SO
– edit(File file) - editor asociado en el SO
– mail(URI mailtoURI) - lanza clte email definido
– open(File file) - aplicación asociada en el SO
– print(File file) - impresión nativa en el SO
• Área de notificación (System Tray)
– java.awt.SystemTray - add(TrayIcon)
Programación III Tema 7b - Swing
39. Swing e hilos
• SwingUtilities.invokeLater( Runnable )
– "hazlo cuando puedas"
public static void main(String[] args) {
SwingUtilities.invokeLater( new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
Programación III Tema 7b - Swing