Вы находитесь на странице: 1из 24

Construcción de GUI en

Elementos de Swing
Java
• Tecnología Swing • Componentes y contenedores
– NetScape (IFC) , IBM, Lighthouse Design
– Componentes. Aspecto visible del interfaz
• JFC
• botones, etiquetas, campos de texto, etc
– AWT, Java 2D, Accesibility, Drag and Drop, Swing
• Se sitúan dentro de algún contenedor
• Cambios importantes desde la versión 1.1 a 1.2
– Versión 1.1 AWT – Contenedores. Almacenes de componentes
– Versión 1.2 en adelante incluyen JFC: SWING • Pueden contener a otros contenedores
– Actualmente, los navegadores no entienden JFC
• Dos tipos
• Swing está apoyado en parte en AWT – Superiores: JApplet, JFrame, JDialog,
• AWT Abstract Window Toolkit – Intermedios: JPanel, JScrollPane,
– La librería se encuentra en el paquete java.awt JSplitPane, JTabbedPane, JToolBar y otros
más especializados
1 3

AWT v SWING Contenedores superiores I

• Por cada elemento de AWT existe un elemento en


el sistema operativo que lo representa
– El resultado final dependerá de este elemento
• Problema:
– Hay facilidades que algún sistema operativo no tiene
por lo que AWT define lo mínimo común
• Swing elimina este problema • Disponen de un panel de contenidos (contentPane)
– Definea lo máximo • Pueden opcionalmente disponer de un menú
– Necesita los paquetes (y subpaquetes)
Container cpane = unaFrame.getContetPane();
• java.awt.* y javax.swing.* unaFrame.setContentPane(unPanel);
2 unaFrame.setJMenuBar(unMenuBar); 4

•1
Construcción de un GUI.
Contenedores Superiores II Pasos a seguir
setSize()
setVisible() Component • I. Crear un contenedor superior y obtener su
contenedor intermedio
Container
• II. Seleccionar un gestor de esquemas para el
contenedor intermedio
pack() Window Panel
• III. Crear los componentes adecuados
Dialog setTitle() Frame Applet • IV. Agregarlos al contenedor intermedio
• V. Dimensionar el contenedor superior
• VI. Mostrar el contenedor superior
JDialog JFrame JApplet
getContentPane() getContentPane() getContentPane()
5 7

I. Crear un contenedor
Contenedores Intermedios
superior
Component • Hay tres clases contenedores superiores
add()
– JFrame, JDialog, JApplet
setLayout() Container • JFrame -> Aplicación
– Ventana de nivel superior con bordes y título
– setTitle(),getTitle(),setIconImage()
JComponent • JApplet -> Applets
• JDialog -> Diálogos
JPanel JScrollPane JSplitPane JTabbedPane JToolBar – Métodos de instancia ...
void pack()
Container getContentPane()
•El contenedor más utilizado es JPanel
void setContentPane(Container)
void setJMenuBar(Menu)
6 8

•2
II. Gestor de esquemas IV. Agregar componentes
para cont. intermedio al contenedor
• Determinan como encajan los componentes dentro • Se hace a través del método add() de los
de los contenedores contenedores
JFrame f = new JFrame(“Un ejemplo”);
– Cada contenedor tiene un gestor propio
Container cpane = f.getContetPane();
• Por defecto JPanel tienen BorderLayout cpane.setLayout(new FlowLayout());
– Los gestores (son clases) existentes son: JButton bSi = new JButton(“SI”);
• FlowLayout, BorderLayout, GridLayout, JButton bNo = new JButton(“NO”);
GriBagLayout, CardLayout, BoxLayout, ... JLabel l = new JLabel(“Nombre”);
cpane.add(l);
– Puede no utilizarse el gestor y colocar los elementos cpane.add(bSi);
con setPosition() (no recomendable) cpane.add(bNo);
• Para asignar un gestor de esquemas – El orden es importante
contenedor.setLayout(new FlowLayout()) • A un contenedor intermedio también se le pueden
agregar otros contenedore intermedios
9 11

V. Dimensionar el
III. Crear componentes
contenedor superior I
• Cada componente viene determinado por una clase • Especifica el tamaño del contenedor superior
• Hay que crear un objeto de esa clase • El método a llamar es
void setSize(int anchura, int altura)
JButton bSi = new JButton(“SI”);
JButton bNo = new JButton(“NO”);
JLabel l = new JLabel(“Nombre”);
... JFrame f = new JFrame(“Un ejemplo”);
....
f.setSize(int anchura, int altura)

10 12

•3
V. Dimensionar el
Ejemplo GUI
contenedor superior II
import java.awt.*;
• Una alternativa a utilizar el método setSize()es import javax.swing.*;
el método pack(), que calcula el tamaño de la class GUI01 {
ventana teniendo en cuenta public static void main(String [] args) {
JFrame f = new JFrame(“Un ejemplo·);
– El gestor de esquemas Container cpane = f.getContetPane();
– El número y orden de los componentes añadidos cpane.setLayout(new FlowLayout());
JButton bSi = new JButton(“SI”);
– La dimensión de los componentes (preferida) JButton bNo = new JButton(“NO”);
• void setPreferredSize(Dimension) JLabel l = new JLabel(“Nombre”);
• void setMinimunSize(Dimension) cpane.add(l);
• void setMaximumSize(Dimension)
cpane.add(bSi);
JFrame f = new JFrame(“Un ejemplo”);
cpane.add(bNo);
.... f.pack();
f.pack() f.setVisible(true);
}
}
13 15

VI. Mostrar el contenedor


Ejemplo GUI
superior
• Para hacerlo visible o invisible se utiliza el método • java GUI01
setVisible(boolean) – Sólo las funciones de maximizar y minimizar, cambiar
• Este método es válido para mostrar u ocultar tamaño y mover están operativas
componentes y contenedores – Los botones Si y No ceden cuando se pulsan pero no
realizan ninguna acción
– La ventana no se cierra normalmente
JFrame f = new JFrame(“Un ejemplo”);
....
– No tiene el aspecto de una ventana Windows
f.setVisible(true)

14 16

•4
Ejemplo GUI Iconos

• GUI01n • En algunos constructores y métodos aparece un


– Realizar la ventana anterior como subclase de JFrame argumento Icon que representa un icono
• En el constructor llamar a super(String) • Icon es una interface.
• Todo la interface gráfica se crea en el constructor
• Para cargar un icono desde un fichero
Icon i =
– Luego, una clase con main
new ImageIcon(“c:\\misIconos\\bruja.gif”)
• Crea un objeto de la clase
• Hace pack() y lo muestra con setVisible(true)
– O bien
ImageIcon i =
new ImageIcon(“c:\\misIconos\\bruja.gif”)

17 19

GUI en Swing Aspecto de la aplicación


public static void main(String[] args) {
• Queda por conocer: try {
– Controlar el aspecto de la aplicación UIManager.setLookAndFeel(“Look and feel valido”);
} catch (Exception e) {
• Look and Feel
}
– Usar adecuadamente los gestores de esquemas ...//Trabajar normalmente ...
}
– Estudiar en detalle los componentes
• Posibles Look and Feel
– Asociar acciones a los componentes
"javax.swing.plaf.metal.MetalLookAndFeel"
"com.sun.java.swing.plaf.windows.WindowsLookAndFeel"
"com.sun.java.swing.plaf.motif.MotifLookAndFeel”
"javax.swing.plaf.mac.MacLookAndFeel"

18 20

•5
Otros aspectos FlowLayout

• Los componentes fluyen de izquierda a derecha y


de arriba a abajo.
• Su tamaño se ajusta al texto que presentan
• Al cambiar el tamaño de la ventana, puede
cambiar la disposición

21 23

Gestores de Esquemas BorderLayout

• Clases que determinan cómo se distribuirán los • Divide el contenedor en 5 partes


componentes dentro del contenedor. • NORTH, SOUTH, EAST, WEST y CENTER
• La mayoría definidos en java.awt – Los componentes se ajustan hasta rellenar
– FlowLayout completamente cada parte
– BorderLayout
– Si algún componente falta, se ajusta con el resto
– GridLayout (menos el centro si hay cruzados)
– GridBagLayout
– Para añadir al contenedor se utiliza una versión
– CardLayout (Swing propone alternativa)
de add que indica la zona en la que se añade
– BoxLayout (nueva en Swing: javax.swing)
(Constantes definidas en la clase)
• JPanel por defecto disponde de un BorderLayout add(bSi,BorderLayout.NORTH)
22 24

•6
BorderLayout BoxLayout

• Coloca a los componentes a lo largo de un eje.


–Define dos constantes X_AXIS,Y_AXIS
• En el constructor debemos indicar
–El contenedor y la orientación de los componentes
BoxLayout(Container, int)
Sin Norte ni Este –Los componentes no tienen igual tamaño (como en
GridLayout)
• Existe la clase Box para facilitar la construcción
–Es un Container
• El orden a la hora de agregar determina la
Ejercicio: Realizar este GUI posición (de izda a drcha y de arriba a abajo)
GUI02.java cpane.setLayout(new BoxLayout(this,BoxLayout.X_AXIS))
25 27

GridLayout GUI complejos I

• Divide al componente en una rejilla (grid) • Podemos utilizar un contenedor intermedio en


• En el constructor debemos indicar el número de lugar de un componente para agregarlo a otro
filas y de columnas contenedor intermedio
• Los componentes se mantienen de igual tamaño • Este nuevo contenedor intermedio podrá:
dentro de cada celdilla – incorporar sus propios componentes
• El orden a la hora de agregar determina la – tener su propio gestor de esquemas
posición (de izda a drcha y de arriba a abajo)
cpane.setLayout(new GridLayout(2,3))
– Dos filas y tres columnas
26 28

•7
GUI Complejos II JScrollPane II
import java.awt.*;
JFrame f = new JFrame(“Un ejemplo·); import javax.swing.*;
f.getContentPane(new BorderLayout()); class GUISP {
JPanel p = new JPanel(); public static void main(String [] args) {
JButton bp1 = new JButton(“Panel1”); JFrame frame = new JFrame("Un ejemplo");
JButton bp2 = new JButton(“Panel2”); ImageIcon ii = new ImageIcon("carapin.gif");
JLabel label = new JLabel(ii);
p.setLayout(new GridLayout(2,1)); ScrollPane scrollPane = new ScrollPane(label);
p.add(bp1); frame.getContentPane().add(scrollPane);
p.add(bp2); frame.pack();
frame.setVisible(true);
... }
}
f.getContentPane().add(p,BorderLayout.WEST);
...
Ejercicio: jugar con setVisible
GUI03.java
29 31

JScrollPane I JSplitPane I

• Permite hacer scroll a un componente (u otro •Divide una ventana en dos


contenedor intermedio) • Vertical u horizontal
– Costructores • Movimiento visible o no
JScrollPane JScrollPane(JComponent); •Constructores (entre otros)
JScrollPane JScrollPane(JComponent,int,int); SplitPane(int, JComponent, JComponent)
SplitPane(int, boolean, JComponent, JComponent)
– Constantes para control del scroll
•Constantes
VERTICAL_SCROLLBAR_AS_NEEDED
HORIZONTAL_SCROLLBAR_AS_NEEDED HORIZONTAL_SPLIT VERTICAL_SPLIT
VERTICAL_SCROLLBAR_ALWAYS
HORIZONTAL_SCROLLBAR_ALWAYS
•Métodos de instancia
VERTICAL_SCROLLBAR_NEVER setOneTouchExpandable(boolean);
HORIZONTAL_SCROLLBAR_NEVER
setDividerLocation(int);

30 32

•8
JSplitPane II JTabbedPane
import java.awt.*; ImageIcon icon = new ImageIcon("images/middle.gif");
import javax.swing.*; JTabbedPane tabbedPane = new JTabbedPane();
class GUISiP { Component panel1 = makeTextPanel("Blah");
public static void main(String [] args) {
tabbedPane.addTab("One", icon, panel1, "Does nothing");
jFrame frame = new JFrame("Un ejemplo");
ImageIcon ii = new ImageIcon("carapin.gif"); tabbedPane.setSelectedIndex(0);
JLabel label1 = new JLabel(ii); Component panel2 = makeTextPanel("Blah blah");
JLabel label2 = new JLabel("Cara bonita"); tabbedPane.addTab("Two", icon, panel2, "Does twice as much");
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, Component panel3 = makeTextPanel("Blah blah blah");
label1,label2);
tabbedPane.addTab("Three", icon, panel3, "Still does nothing");
splitPane.setOneTouchExpandable(true);
frame.getContentPane().add(splitPane); Component panel4 = makeTextPanel("Blah blah blah blah");
frame.pack(); tabbedPane.addTab("Four", icon, panel4, "Does nothing at all");
frame.setVisible(true);
}
}

33 35

JTabbedPane I JToolBar I

•Permite simular carpetas sobre la ventana •Crea un barra de botones


•Constructores (entre otros) – Debe incluirse en un contenedor con BorderLayout
– Usualmente contiene botones con iconos
JTabbedPane()
•Constructor
JTabbedPane(int) JToolBar()
•Constantes JToolBar(int) // HORIZONTAL VERTICAL
TOP BOTTOM LEFT RIGHT •Métodos de instancia
•Métodos de instancia addSeparator()
addTab(String, Component) setFloatable(boolean) // flota por defecto
addTab(String, Icon, Component)
addTab(String, Icon, Component, String)
setSelectedIndex(int);
34 36

•9
JToolBar II Componentes II setToolTips()
setBorder()
setEnable()
JToolBar toolBar = new JToolBar();
JButton button = null; JComponent setVisible()
setBackground()
button = new JButton(new ImageIcon("images/left.gif")); ... ....
toolBar.add(button);
button = new JButton(new ImageIcon("images/middle.gif"));
JList JComboBox JMenuBar JFileChooser
toolBar.add(button);
button = new JButton(new ImageIcon("images/right.gif"));
JOptionPane
toolBar.add(button);
pane.add(toolBar,BorderLayout.NORTH);
JTextArea JTextField

37 39

Componentes I setToolTips() Componentes III


setBorder()
setEnable()
JComponent setVisible()
• Métodos heredados de JComponent
setBackground()
... .... – Color getBackground()
JLabel AbstractButton – void setBackground(Color)
– Graphics getGraphics()
JToggleButton JButton JMenuItem – String getName()
– Toolkit getToolkit()
– void setEnable(boolean)
JCheckBox JRadioButton – void setVisible(boolean)
– void paint(Graphics g)
JRadioButtonItem JCheckBoxItem JMenu – void repaint()
ButtonGroup – void setBorder()
– ...
38 40

•10
Bordes I JButton

• En javax.swing.borders existen una serie • Crea botones de pulsación


de clases que permiten dar un borde a un • Constructores
componente. Hay nueve clases: JButton()
– AbstractBorder JButton(String)
JButton(String,Icon)
– BevelBorder
JButton(Icon)
– CompountBorder
– EmptyBorder
– EtchedBorder
• Métodos
String getText()
– LineBorder
void setText(String)
– MatteBorder
...
– SoftBevelBorder
– TitleBorder
41 43

Bordes II JLabel

• Para cambiar el borde de un componente • Es una etiqueta con una línea de texto.
– public void setBorder(Border) • Constructores
JButton b = new JButton(“Aceptar”); JLabel([String,] [Icon,] [int])
b.setBorder(new TitledBorder(“Boton”))
Constantes
• La clase javax.swing.BorderFactory tiene LEFT RIGHT CENTER
métodos de clase para crear bordes • Métodos de instancia
String getText()
– Múltiples peticiones de crear un mismo borde
void setText(String)
devuelven el mismo borde.
...
JButton b = new JButton(“Aceptar”);
b.setBorder(BorderFactory.createTitleBorder(“Boton”))

42 44

•11
JCheckBox Ejemplo con botones I
import java.awt.*;
import javax.swing.*;
• Marcadores class GUI04 {
• Constructores public static void main(String [] args) {
JCheckBox([String,] [Icon,] [boolean]) JFrame f = new JFrame("Ejemplo de Botones");

• Métodos de instancia JButton bNorte = new JButton("Norte");


String getText() JLabel lSur = new JLabel("Este es el Sur",
void setText(String) JLabel.CENTER);
boolean isSelected() JCheckBox cEste = new JCheckBox("Este",true);
JButton bCentro= new JButton("Centro");
void setSelected(boolean)
JRadioButton cp1 = new JRadioButton("RB1");
... JRadioButton cp2 = new JRadioButton("RB2",true);

ButtonGroup gcb = new ButtonGroup();


gcb.add(cp1);
45 gcb.add(cp2); 47

JRadioButtons y
Ejemplo con botones II
ButtonGroup JPanel prb = new JPanel();
prb.setLayout(new GridLayout(2,1));
• Botones circulares prb.add(cp1);
prb.add(cp2);
• Se agrupan de manera que sólo uno esté pulsado
• Constructores Container contP = f.getContentPane();
contP.add(bNorte,BorderLayout.NORTH);
JRadioButtons([String,] [Icon,] [boolean])
contP.add(lSur,BorderLayout.SOUTH);
• Métodos de instancia contP.add(cEste,BorderLayout.EAST);
Igual que JCheckBox contP.add(prb,BorderLayout.WEST);
contP.add(bCentro,BorderLayout.CENTER);
• Para agruparlos, se crea una instancia de ButtonGroup y se f.pack();
añaden con add(AbstractButton) f.setVisible(true);
}
}

46 48

•12
JTextField Jlist I
• Permite editar texto en una línea. • Muestra una lista de elementos para su selección.
• Constructores • Constructores
JTextField ([String,] [int]) JList() JList(Object [])
• Métodos JList(Vector) JList(ListModel)
String getText() • Métodos de instancia
String getText(int,int) // offset y len int getSelectedIndex() // -1 si no hay
void setEditable(boolean) int [] getSelectedIndices()
boolean isEditable() Object getSelectedValue()
... Object [] getSelectedValues()
– Tiene una subclase que enmascara el eco (* u otro símbolo) boolean isSelectedIndex(int)
JPasswordField boolean isSelectionEmpty([])
– con un método de instancia void setListData(Object)
char [] getPassword() void setListData(Vector)
49 51

JTextArea JList II
• Permite editar texto en un area. • Métodos de instancia
• Constructores void setSelectionMode(int)
get selectionMode()
JTextArea ([String,] [int,int])
...
• Métodos
void append(String) • Constantes
void insert(String,int) ListSelectionModel.SINGLE_SELECTION
igual que JTextField ListSelectionModel.SINGLE_INTERVAL_SELECTION
... ListSelectionModel.MULTIPLE_INTERVAL_SELECTION

50 52

•13
JComboBox JDialog

• Permite la selección de un item de entre varios. • Es un elemento de visualización al igual que


• No está desplegado como Jlist Frame
– Se suele crear y no visualizar hasta que sea necesario
• Constructores setVisible(true)
JComboBox() JComboBox(Object []) – Para ocultarla setVisible(false)
JComboBox(Vector) JComboBox(ListModel) – Para eliminarla dispose()
• Métodos de instancia • JDialog(Frame, String, boolean)
int getSelectedIndex()
• Frame es la ventana padre
Object getSelectedItem() • String, el título
void setSelectedIndex(int) • boolean indica si es modal o no
new JDialog(f,”Ventana modal”,true);
boolean isEditable() – Container getContenPane()
void setEditable(boolean)
53 55

Ejercicio JOptionPane I

• Clase que contiene métodos de clase para crear


distintas ventanas de mensajes (modales)
• Métodos de clase
showConfirmDialog(...)
• Realiza una pregunta de confirmación como Si, No Cancelar
showInputDialog(...)
• Espera una entrada
showMessageDialog(...)
• Informa de algo que ha ocurrido
GUIcomp.java
showOptionDialog(...)
• Unifica las tres anteriores.
54 56

•14
JOptionPane II JOptionPane IV

• Argumentos de los métodos showXXXDialog(...) showConfirmDialog(Component padre,


Component padre Puede ser null Object mensaje,
Object mensaje Usualmente un String String title,
String titulo De la ventana
int tipoOpcion int optionType,
ERROR_MESSAGE INFORMATION_MESSAGE int messageType,
WARNING_MESSAGE QUESTION_MESSAGE PLAIN_MESSAGE
Icon icon)
int tipoMensaje
DEFAULT_OPTION YES_NO_OPTION Hay más constructores para este tipo de ventanas
YES_NO_CANCEL_OPTION OK_CANCEL_OPTION
JOptionPane.showConfirmDialog(
Icon icono Hay uno por defecto
Object [] opciones null,
Object valorInicial ”Esta seguro",
”Ventana de Seguridad",
57 JOptionPane.YES_NO_OPTION); 59

JOptionPane III JFileChooser

• Valores devueltos por los métodos • Es un elemento de visualización al igual que


showXXXDialog(...) permite la selección de un fichero
YES_OPTION – Manipula nombres de ficheros
NO_OPTION
• Constructores
CANCEL_OPTION
JFileDialog()
OK_OPTION
CLOSED_OPTION JFileDialog(String) // path
JFileDialog(File)
• Métodos de instancia
int showOpenDialog(Component)
int showCloseDialog(Component)
File getSelectedFile()
File [] getSelectedFiles()
58 60

•15
Menús Ejemplo de Menú

• Se pueden añadir a los contenedores superiores


• Para añadir un menú
• void setJMenuBar(JMenuBar)

• Tres elementos básicos


– Barra de Menú (JMenuBar)
– Entrada de Menú (JMenu)
– Item de entrada (JMenuItem y ....)
• El menú de ayuda se añade a un JMenuBar (aún
no está implementado)
void setHelpMenu(JMenu) GUI07.java
61 63

Menús KeyEvent

• Un item puede ser a su vez un menú • La clase KeyEvent incluye constantes para
– Para añadir a un JMenuBar una entrada acelerar las pulsaciones para llegar a un de un
• void add(JMenu)
– Para añadir a un JMenu JMenuItem
• void add(JMenuItem) – VK_1, VK_2,...
• void add(JMenuItem, MenuShortcut)
• void addSeparator()
– VK_A, VK_B,...
– Para manejar los items y entradas – VK_F1, VK_F2,..
• void setEnabled(boolean)
• boolean isEnabled() • La clase se encuentra en el paquete java.awt.event
add(new JMenuItem(“Entrada”,KeyEvent.VK_E));
• Un CheckBoxMenuItem se puede seleccionar
– boolean getState()
– void setState(boolean)
62 64

•16
PopupMenu El Modelo de Eventos

• Crea menús aislados (en cualquier ventana) • Un componente (o menú componente) puede
– JPopupMenu() disparar un evento
• Contiene elementos de menu java.awt.event javax.swing.event
– add(MenuItem) • Cuando un evento se dispara, es recogido por
• Debe activarse en un componente dada una objetos “oyentes” (listeners) que realizan la acción
posición de visualización apropiada
– show(JComponent, int x, int y) • Cada oyente debe pertenecer a una clase que
implemente cierta interface dependiendo del
evento

65 67

El Modelo de Eventos El Modelo de Eventos

• La versión 1.0 incluía un modelo de eventos • Para que un oyente esté pendiente de un
diferente componente, se debe registrar en él
• Desde la versión 1.1 incluye el nuevo modelo de • El registro es realizado a través de un método del
eventos que se mantiene como definitivo en 1.3 componente sobre el que se registra
(incluso para la librería Swing que añade algo) – addXxxxxListener(XxxxxListener)
• Sólo vamos a ver el modelo nuevo • El receptor es el componente que queremos escuchar
• El argumento será el objeto oyente
• XxxxxListener indica la interface que va a implementar
– Por ejemplo, dado la interface ActionListener, un
objeto se registra por medio de
• addActionListener(ActionListener)
66 68

•17
Interfaces en
Eventos
java.awt.event I
Interfaces Métodos
ActionListener actionPerformed(ActionEvent) • Los eventos se implementan como subclases de
AdjustmentListener adjustmentValueChanged(AdjustementEvent) java.util.EventObject
Object getSource()
ComponentListener componentHidden(ComponentEvent)
componentMoved(ComponentEvent) – Los eventos se encuentran en los paquetes
componentResized(ComponentEvent) java.awt.event y javax.swing.event
componentShown(ComponentEvent) • Interfaces XxxxxListener
ContainerListener componentAdded(ContainerEvent)
• Evento EventXxxxx
componentRemoved(ContainerEvent) – Como ya hemos dicho, para registrar a un oyente se
FocusListener focusGained(FocusEvent) utiliza
focusLost(FocusEvent) • Registro addXxxxxListener(XxxxxListener)
ItemListener itemStateChanged(ItemEvent) – Todos los métodos de la interface tendrán como
KeyListener keyPressed(KeyEvent) argumento
keyReleased(KeyEvent) • Evento EventXxxxx
keyTyped(KeyEvent) 69 71

Interfaces en
ActionListener I
java.awt.event II
Interfaces Métodos
MouseListener mouseClicked(MouseEvent)
• Se lanza si:
mouseEntered(MouseEvent) – Se pulsa un botón de cualquier tipo
mouseExited(MouseEvent)
mousePressed(MouseEvent) – Doble pulsación en un item de una lista
mouseReleased(MouseEvent) – Selección de una opción de menú
MouseMotionListener mouseDragged(MouseEvent)
mouseMoved(MouseEvent) – Pulsar retorno en un campo de texto
TextListener textValueChanged(TextEvent) void actionPerformed(ActionEvent)
WindowListener windowActivated(WindowEvent)
windowClosed(WindowEvent) • Ejemplos:
windowClosing(WindowEvent) – GUI01c.java
windowDeactivated(WindowEvent)
windowDeiconified(WindowEvent) • El oyente es la propia ventana
windowIconified(WindowEvent) – y GUI01c1.java
windowOpened(WindowEvent)
70 • El oyente es un objeto con visibilidad 72

•18
ActionListener II ItemListener

• Si un oyente está pendiente de varios objetos, • Se dispara si se pulsa en


puede – JCheckBox
– preguntar por quién lo ha activado – JCheckBoxMenuItem
• Object getSource()
– JList (simple pulsación)
– añadir junto con el registro una acción
void itemStateChanged(ItemEvent)
• addActionCommand(String)
y consultarla desde el oyente • ItemEvent
• String getActionCommand() – Object getItemSelectable()
– int getStateChanged()
• ver GUI01c2.java • Puede ser ItemEvent.SELECTED o
• ver GUIDia.java (uso de Dialog) ItemEvent.DESELECTED

73 75

FocusListener KeyListener

• Controla cuando un componente gana o pierde el • Se dispara


foco – Cuando se pulsa o libera una tecla en un componente
void focusGained(FocusEvent) que tiene el foco
void focusLost(FocusEvent) void keyTyped(KeyEvent)

• Ejemplo: GUI08.java void keyPressed(KeyEvent)

void keyReleased(KeyEvent)

• Métodos de KeyEvent
– int getKeyChar(), int getKeyCode(),
– int getModifiersText(), ...
– Define como constante cualquier pulsación. Ver
documentación
74 76

•19
MouseListener MouseMotionListener

• Para actuar con el ratón desde cualquier • Para actuar con los movimientos del ratón
componente (no los movimientos) desde cualquier componente
void mouseClicked(MouseEvent)
void mouseDragged(MouseEvent)
void mouseEntered(MouseEvent)
void mouseExited(MouseEvent) void mouseMoved(MouseEvent)
void mousePressed(MouseEvent)
• MouseInputListener
void mouseReleased(MouseEvent)
javax.swing.event
• MouseEvent – Hereda de ambas
– int getClickCount()
– int getX(), int getY(), Point getPoint()
interfaces
– boolean isPopupTrigger() – Ejemplo GUI10.java
– Define como constante el tipo de pulsación. Ver
documentación.
77 79

MouseListener WindowListener

• GUI09.java • Controla el movimiento de una ventana (window)


void windowClosing(Windowvent)
void windowOpened(WindowEvent)
void windowIconified(WindowEvent)
void windowDeiconified(WindowEvent)
void windowClosed(WindowEvent)
void windowActivated(WindowEvent)
void windowDeactivated(WindowEvent)
• WindowEvent
– int getWindow()
– Ejemplo GUI11.java
78 80

•20
Clase Anónima para
Adaptadores
WindowAdapter
class Ventana extends JFrame {
• Es tedioso tener que implementar todas las
public Ventana() {
funciones de una interface. super("Eventos de ventana");
– Por ejemplo, de un WindowListener puede interesar addWindowListener(new WindowAdapter() {
sólo el método de cierre, es decir windowClosing. public void windowClosing(WindowEvent e) {
System.exit(0);
– Si se implementa la interface hay que implementar
}
todas las funciones, aunque estén vacías }
• Una solución, los adaptadores );
}
– Son clases que implementan una interface con un
}
comportamiento por defecto.
– Podemos crear nuestros oyentes como subclases de • Ver GUI12a.java
estos adaptadores y redefinir cualquier método.
81 83

Adaptadores La clase Graphics I

• Hay adaptadores para • Controla la parte gráfica del lenguaje


– ComponentListener ComponentAdapter – Cada componente dispone del método
– ContainerListener ContainerAdapter public void paintComponent(Graphics)
– FocusListener FocusAdapter – Redefiniendo este método podemos pintar sobre él.
– KeyListener KeyAdapter – Un objeto Graphics contiene:
– MouseListener MouseAdapter • El objeto de tipo Component sobre el que se pinta
• Un origen de traslación para coordenadas de pintado y clipping
– MouseMotionListenerMouseMotionAdapter
• La región actual ocupada por el componente
– WindowListener WindowAdapter
• El color actual
• Ejemplo GUI11.java con adapter es GUI12.java • La fuente de caracteres actual
• La operación lógica actual para utilizar con pixeles (XOR o Paint)
• La actual alteración de color XOR

82 84

•21
La clase Graphics II Dibujar con Swing

• Algunos métodos de interés • paintComponent(Graphics)


– Invocado por el sistema cada vez que necesita pintar
clearRect(int x,int y,int anchura,int altura ) • Si se redefine, se debe llamar primero al mismo método del
super para que pinte el fondo.
copyArea(int x,int y,int anc,int alt,int – repaint()
xDes,int yDes ) – repaint(int x, int y, int w, int h)
• Invocado por el usuario.
setColor(Color c)

translate(int, int)

85 87

La clase Graphics III Ejemplo

• Para pintar un círculo enviar al objeto Graphics


el mensaje drawOval(int x,int y,int rx,int ry)
• Inicialmente es drawOval(60,60,20,20)
• crece
– Incrementa el radio en 10
• decrece
– Decrementa el radio en 10
• Se cierra correctamente
– GUIad.java y
86
– GUIada.java 88

•22
La clase Graphics IV Applets I

• Métodos para pintar textos • Aplicaciones diseñadas para ser ejecutadas en un


– drawString(String,int,int) navegador
• JApplet es un contenedor superior
• Cambio de fuentes
– No dispone de método main()
– setFont(Font)
– Dispone de métodos
• Fuentes. En el constructor hay que indicar • init() Método de inicialización. Aquí se debe construir la
forma del applet
– Nombre: “Helvetica”, “Courier”,...
• start() Se ejecuta justo antes de la presentación de un applet
– Familia: Font.PLAIN, Font.BOLD,Font.ITALIC • stop() Se ejecuta justo antes de la ocultación de un applet
– Tamaño: 12, 14, 16, ... • destroy() Cuando desaparece el applet

89 91

La clase Graphics V Applets II

• Las imágenes son objetos de la clase Image • Cualquier applet debe heredar de la clase JApplet
– Para pintar una imagen hay varios métodos • Un applet debe ser una clase pública
drawImage(Image, int, int, int, int ImageObserver)
• No puede acceder a los recursos locales
• El método termina aún cuando la imagen no esté – Certificados
completamente pintada
• ImageObserver es un objeto que es avisado public class SimpleApplet extends JApplets {
cuando termine de pintar la imagen public void init() {
JLabel label = new JLabel("Hola mundo");
– Dos forma de obtener una imagen getContentPane().add(label, BorderLayout.CENTER);
Toolkit.getDefaultToolkit().getImage("dibujos.gif" );
}
(new (ImageIcon(“miImagen.gif”))).getImage();
}
• Ver Imagen.java
90 92

•23
Arrancar un Applets Ejemplo de applets

• La ejecución debe realizarse desde una página • Ejercicio: LanzaPinta.html


HTML <applet codebase=. code=PintaParam.class width=300 height=200>
<applet codebase=. code=SimpleApplet.class width=350 height=60> <param name= figura1 value= circulo-verde-100-100-45>
...
<\applet> <param name= figura2 value= circulo-rojo-0-90-90>
<param name= figura3 value= rectangulo-azul-20-20-80-90>
donde
<param name= figura4 value= linea-amarillo-0-0-200-200>
codebase : Indica el camino donde buscar las clases </applet>
code : Indica el nombre de la clase a lanzar
width : Indica la anchura de la ventana
height : Indica la altura de la ventana
aling : Indica la alineación center, left, right
• Ver lanzaSimple.html y lanzaMuestra.html
(appletViewer)
• Herramientas de conversión para navegadores no Swing
93 95

Applets Applets en ficheros .jar

– URL getDocumentBase() • Se pueden juntar varias clases de un applet en un


• Valor actual del documento presente en el navegador fichero .jar
– URL getCodeBase() – Optimiza la comunicación
• Directorio del código fuente del applet • jar cf misClases.jar *.class
– URL se encuentra en el paquete java.net – En el fichero .html
– void showDocument(URL) < applet code = “laClase.class”
• pide que muestre el documento indicado archive = “misClases.jar”
– void showStatus(String) width = 300 height = 150>
• Saca un mensaje por la barra de estado del navegador
</applet>
– El fichero .jar debe incluirse en CLASSPATH

94 96

•24

Вам также может понравиться