LP3 N° 09 - 3.1 IDE Java Swing
LP3 N° 09 - 3.1 IDE Java Swing
Docentes:
Angel Montesinos Murillo
Eveling G. Castro Gutierrez
Diapositivas adaptadas de : Guevara, K. (2023). Diapositivas “Lenguaje de Programación III”, Universidad Católica de Santa Maria, Arequipa – Perú.
Java GUI
La librería Swing
//java.sun.com/docs/books/tutorial/uiswing
//programacion.com/java/tutorial/swing/
Programación conducida por eventos
• En programas tradicionales (basados en texto):
• el programa controla el flujo de la ejecución
• el programa controla la secuencia de las entradas
• ▪ Los programas con GUI son “event-driven”
• la secuencia de las entradas controlan el flujo de la ejecución
• el sistema invoca código del usuario
Programación conducida por eventos
Código
del
sistema
Su código
Generación de eventos
1. Las acciones tales como: pulsar un botón, mover el mouse,
etc. son reconocidas e identificadas por los sistemas
operativos (OS) o la JVM.
2. Por cada acción el OS/JVM determinan cuál de los programas
que se están ejecutando recibirán la señal (de la acción).
3. Las señales que la aplicaciones reciben del OS/JVM como
resultado de una acción son llamadas eventos.
Generación de eventos
GUI
Sistema Operativo
Aplicación 1 Aplicación 2
Manejo de eventos
• Una aplicación responde a los eventos ejecutando código adecuado
para cada tipo particular de eventos.
• No todos los eventos necesitan ser tenidos en cuenta por una
aplicación. Por ejemplo: Una aplicación para dibujar puede estar
interesada sólo en movimientos del mouse.
• Como diseñador de una aplicación manejada por eventos, deberá
escribir clases/métodos para manejar los eventos relevantes.
Java GUI
• Java provee dos librerías para crear GUIs:
• Java AWT (Abstract Window Toolkit)
• Java Foundation Classes (JFC o Swing), a partir
de Java2
AWT Swing
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
Paquetes JFC/Swing
• javax.swing
• javax.swing.plaf • javax.swing.table
• javax.swing.plaf.basic • javax.swing.tree
• javax.swing.plaf.metal • javax.swing.border
• javax.swing.plaf.multi • javax.swing.colorchooser
• javax.swing.filechooser
• javax.swing.text
• javax.swing.text.html
• javax.swing.text.html.parser
• javax.swing.event
• javax.swing.text.rtf • javax.swing.undo
Paquetes JFC/Swing Componentes,
Control del incluyendo
“Look & Feel” componentes
de Swing complejos
JMenu
JMenuBar
JComponent
JLayeredPane
JRootPane
JPanel
JTabbedPane
JDesktopPane
JSplitPane
JPopupMenu JInternalFrame JScrollPane
JOptionPane JToolbar
Similar a AWT
Nuevos de
Swing
Componentes de Swing
• La clase Component (y sus subclases) proveen soporte para manejo
de eventos, cambio del tamaño de un componente, control de color y
fuentes, pintado.
• Un componente es un objeto de una subclase concreta.
• Se distinguen dos clases de componentes:
• Componentes de control de la GUI: la interacción de la GUI con el usuario se
realiza a través de ellos.
• Contenedores: contienen otros componentes (u otros contenedores).
Contenedores
• Anidamiento de componentes (Jerarquía de contenedores en
contraste con la Jerarquía de herencia). Cada programa Swing
contiene al menos una.
• Usan un Layout Manager para determinar cómo se disponen los
componentes en los contenedores.
• Swing provee 4 contenedores de alto nivel (ventana base de la GUI):
JFrame, JApplet, JDialog y JWindow.
• La jerarquía está compuesta de diferentes capas. Cada contenedor de
alto nivel contiene un contenedor intermedio conocido como
“content pane ”. En casi todos los programas no es necesario conocer
qué hay entre el contenedor de alto nivel y el content pane.
Jerarquía de contenedores
Jerarquía de contenedores
• La apariencia de una GUI está determinada por:
• La jerarquía de contenedores
• El Layout Manager de cada contenedor
• Las propiedades de los componentes individuales
TabbedPane Toolbar
Contenedores especiales
InternalFrame LayeredPane
Root Pane
JFrame
Algunos métodos de JFrame
• Para añadir componentes al content pane:
myFrameInstance.getContentPane().add(myComponent);
theWindow.setJMenuBar(cyanMenuBar);
theWindow.setSize( 220, 100 );//o mejor
theWindow.pack();
Nueva funcionalidad de JFrame
• setDefaultCloseOperation(int) es la más importante:
• DO_NOTHING_ON_CLOSE
• HIDE_ON_CLOSE (default) oculta el frame cuando el usuario lo cierra pero no
se deshace de los recursos del sistema asociados (puedo volver a mostrar).
• Propiedades
JButton
• Métodos
• Eventos
Componentes GUI
1. Crear
• Instanciar objeto: b = new JButton(“press me”);
2. Configurar
• Propiedades: b.text = “press me”; (evitar en Java)
• Métodos:
b2 = new JButton("Middle button", middleButtonIcon)
b2.setVerticalTextPosition(AbstractButton.BOTTOM);
b2.setHorizontalTextPosition(AbstractButton.CENTER);
b2.setMnemonic(KeyEvent.VK_M);
b2.setToolTipText("This middle button does nothing “ + "when you click it.");
3. Añadir
panel.add(b);
4. Manejar eventos
Características especiales
• Los componentes Swing ofrecen características especiales:
• Mnemonic
button.setMnemonic ("C");
• Disable
JButton button = new JButton (“Do It”);
button.setEnabled (false);
Características especiales
• Bordes
JPanel myPanel = new JPanel();
Border myBorder = BorderFactory.createEtchedBorder();
myPanel.setBorder(myBorder);
Empty Titled
Line Matte
Etched Compound
Bevel
Bordes
Anatomía de una aplicación GUI
JFrame
JFrame
JPanel contenedores
JPanel
JButton
JButton JLabel
JLabel
Estructura interna
GUI
Uso de un componente GUI
1. Crearlo
2. Configurarlo orden
3. Añadir hijo (si es contenedor) importante
Panel
Componentes
JPanel
Listener
▪ Añadir (bottom up)
Listeners a los componentes
Componentes al panel JFrame
Panel al Frame
Window Layout
contenedores
componentes
Window Layout
• Cada contenedor maneja la disposición de sus componentes.
• El programador sólo añade componentes, el contenedor se encarga
de la disposición de los mismos.
• El contenedor usa un Layout Manager para manejar la disposición de
los componentes en el mismo.
• Están disponibles diferentes Layout Managers.
• El layout puede ser determinado especificando Layout Managers para
los contenedores.
Layout Managers
• Hay varios Layout Managers predefinidos en:
• FlowLayout (en java.awt)
• BorderLayout (en java.awt)
• CardLayout (en java.awt)
• GridLayout (en java.awt)
• GridBagLayout (en java.awt)
• BoxLayout (en javax.swing)
• OverlayLayout (en javax.swing)
Layout Managers (LM)
• Cada contenedor tiene un Layout Manager por defecto, aunque se
puede establecer otro LM para el mismo, de forma explícita. Para
anular el LM por defecto se usa el método setLayout (para
contenedores de alto nivel se usa getContentPane().setLayout().
• El Layout Manager intenta ajustar la disposición de los componentes
en el contenedor cuando se añade un nuevo componente o cuando el
contenedor cambia de tamaño.
• Puede crear su propio LM.
Layout Managers de AWT
null FlowLayout GridLayout
ninguno,
Left to right,
programador
Top to bottom
setea x,y,w,h
w e JButton
c One at a time
s
Null Layout
• setLayout(null);
• El programador es responsable de establecer el tamaño y posición de
cada componente (setBounds(x,y,w,h))
Combinaciones
JButton JButton
JTextArea
Combinaciones
JButton JButton
JFrame
n
JPanel: FlowLayout
JPanel: BorderLayout
JTextArea
Tareas comunes del LM
• Prestar atención a indicaciones de un componente:
• de tamaño:
setMinimumSize(Dimension), setPreferredSize(..), setMaximumSize(..)
• de alineamiento:
setAllignmentX(float), setAlignmentY(float)
• Poner espacios entre componentes:
• el LM puede especificar hgap y vgap
• poner componentes invisibles
• bordes vacíos: para componentes que no tienen bordes por default, por ejemplo
JPanel
Estructura del Layout JPanel(BoxLayout(V))
label
rigidArea(0,5) Center
JScrollPane
South
buttonPane.add(setButton);
BoxLayout
• Los componentes son dispuestos de arriba abajo o de izquierda a
derecha en el orden en el cual son añadidos al contenedor.
• Pueden crearse muchas configuraciones distintas, combinando
múltiples contenedores que usen BoxLayout.
• Preferido a un único contenedor que use el más complicado
GridBagLayout (mejor: BoxLayouts anidados), es útil también en
algunas situaciones donde se podría considerar el uso de GridLayout
o BorderLayout.
BoxLayout
• BoxLayout tiene en cuenta el alineamiento, tamaños mínimos, máximos y
preferidos que se eligen para los componentes:
btn.setAlignmentX(float alignmentX);
lbl.setAlignmentY(float alignmentY);
lbl.setMaximumSize(new Dimension(int width, int height);
lbl.setMinimumSize(new Dimension(int width, int height);
lbl.setPreferredSize(new Dimension(int width, int height);
horizontal Box.createHorizontalGlue()
Glue
vertical Box.createVerticalGlue()
new Box.Filler(minSize,
customBox.Filler prefSize, maxSize)
Otras estrategias Swing
Todo lo demás:
Programador
JButton
Cuándo se pinta?
• Pintado disparado por el sistema (se invoca paint())
• La primera vez que el componente es visible
• Cuando un componente es cubierto y luego descubierto
• Cuando es necesario reflejar un cambio en el estado del programa
drawImage(image, x, y, observer)
drawImage(image, x, y, w, h, observer)
drawImage(image, x, y, bgcol, observer)
drawImage(image, x, y, w, h, bgcol, obj)
Horstmann, C. S. (2016). Big Java: early objects. John Wiley & Sons.