Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · •...

36
1 Programación Orientada a Objetos Componentes Gráficos César Julio Bustacara Medina Facultad de Ingeniería Pontificia Universidad Javeriana 03/05/2016

Transcript of Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · •...

Page 1: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

1

Programación Orientada a Objetos

Componentes Gráficos

César Julio Bustacara Medina

Facultad de Ingeniería Pontificia Universidad Javeriana

03/05/2016

Page 2: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

Ejemplo Práctico

• Programa que permite incrementar un número cada vez que se pulse un botón

• Inicialmente el cuadro de texto contiene un “0”

2

Page 3: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

3

Constructoras JFrame() JFrame(String titulo) getContentPane() getJMenuBar() setContentPane(Container contentPane) setDefaultCloseOperation(int operation) setJMenuBar(JMenuBar menu) setLayout(LayoutManager layout) setTitle(String title) setEnabled(bool b)

Page 4: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

Ejemplo Práctico

4

Page 5: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

5

public class VentanaPrincipal extends JFrame { private JPanel contentPane; private JTextField textField; private MyActionListener micontrolador; public JTextField getTextField() { return textField; } public void setTextField(JTextField textField) { this.textField = textField; } /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { VentanaPrincipal frame = new VentanaPrincipal(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); }

Page 6: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

6

/** * Create the frame. */ public VentanaPrincipal() { // crear el controlador micontrolador = new MyActionListener(this); setTitle("Ejemplo01-GUI"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 300); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); textField = new JTextField(); textField.setText("0"); textField.setBounds(85, 11, 153, 20); contentPane.add(textField); textField.setColumns(10); JButton btnIncrementarValor = new JButton("Incrementar Valor"); btnIncrementarValor.addActionListener(micontrolador); btnIncrementarValor.setBounds(85, 58, 153, 23); contentPane.add(btnIncrementarValor); } }

Page 7: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

7

public class MyActionListener implements ActionListener { private VentanaPrincipal ventana; public MyActionListener(VentanaPrincipal ventana){ this.ventana = ventana; } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub String valor = (ventana.getTextField()).getText(); int valFinal = Integer.parseInt(valor); valFinal++; (ventana.getTextField()).setText(String.valueOf(valFinal)); } }

Page 8: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

Ejercicio: Suma y Resta

• Crear un programa que permita sumar o restar dos números

• Añadir dos cajas de texto, una para cada número

• Añadir dos botones, uno para sumar y otro para restar

• Añadir una etiqueta para mostrar el resultado Cada botón tendrá su propio Listener para “escuchar” el click

8

Page 9: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

Ejercicio: Suma y Resta

9

Page 10: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

Ejercicio 2: : Suma y Resta (2)

• Extender el ejercicio anterior para que tanto el botón de sumar como el de restar compartan el mismo Listener

• Para ello, en el método actionPerformed se debe comprobar qué botón generó el evento.

• De acuerdo al botón que fue pulsado, realizar una operación u otra.

10

Page 11: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

Posicionamiento de los componentes: Layouts

• Los Layouts permiten distribuir los controles de distintas maneras en un contenedor

• Cada contenedor puede tener su Layout: Por ejemplo, una ventana puede tener un Layout, contener dos JPanels dispuestos según ese Layout y, luego, cada JPanel podría tener su propio Layout.

11

Page 12: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

Tipos de Layout

12

Page 13: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

BorderLayout • Los paneles de contenido de los JFrame, por defecto,

están inicializados con este tipo de Layout

• Permite colocar componentes (simples o contenedores) en cinco posiciones: Arriba, Abajo, Izquierda, Derecha y Centro

• Las posiciones se indican al añadir el componente al contenedor (mediante el método add – Arriba: PAGE_START o NORTH

– Abajo: PAGE_END o SOUTH

– Izquierda: LINE_START o WEST

– Derecha: LINE_END o EAST

– Centro: CENTER

13

Page 14: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

BorderLayout Funciones importantes del API:

• BorderLayout(int horizontalGap, int verticalGap)

• setHgap (int)

• setVgap (int)

14

// Se crea el layout con gap de 5 píxeles en ambos lados BorderLayout layout = new BorderLayout( 5, 5 ); // Se asocia el layout al Frame actual setLayout( layout ); // Se adiciona el botón al Frame, en la posición Norte JButton button = new JButton(“NORTH”); add( button, BorderLayout.NORTH );

Page 15: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

Ejercicio • Crear la interfaz que se observa abajo.

– Se debe usar BorderLayout para colocar los botones. – Al pulsar un botón, ese botón debe ocultarse. – El resto de botones ocuparán el espacio disponible

automáticamente. – Si había otro botón oculto, debe volver a mostrarse

(sólo debe haber un botón oculto cada vez) – Consejo: usar un array de JButtons y el mismo

Listener para todos

15

Page 16: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

LayoutManager : manejador de disposición y apariencia

– Define el tamaño y posición de un componente dentro de un contenedor.

– JFrame, JPanel, JApplet, JDialog lo tienen por defecto (BorderLayout) pero se puede asociar otro.

– Ejemplos:

Page 17: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

Componente etiqueta: JLabel

Page 18: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

JLabel: Etiquetas • Se utilizan para mostrar instrucciones de texto ó

información que explica el propósito de un componente en una forma.

– Cada JLabel tiene un nombre que lo identifica de manera única dentro del contenedor

Page 19: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

Otros métodos del JLabel

• toolTipText(): especifica un descriptivo del componente gráfico

• getText() : retorna el valor del Jlabel

• setText(String texto): asigna el valor al JLabel.

Page 20: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

Componentes cajas de edición: JTextComponent

Page 21: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

clase JTextComponent • Le permite al usuario entrar texto en un

componente, cuando dicho componente tiene el foco, esto es, tiene el cursor ubicado sobre él.

• Algunos JTextComponent (subclases) – JTextField

– JPasswordField

– JFormattedTextField

Page 22: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

Clase JTextField

Métodos:

String getText();

void setText(String texto);

Page 23: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

Componentes botones

Page 24: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

Botón • Componente sobre el cual el usuario hace

click para ejecutar una acción específica

• Los botones pueden ser: – Botón de comando

– Caja de chequeo

– Botón de radio

– Botón de alternado

Page 25: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

Botón de Comando

• Genera un evento cuando el usuario hace click sobre él

• Se crea usando la clase JButton

• El método setText() permite cambiar el texto que se ve en el botón

Page 26: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

26

Page 27: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

Jerarquías de eventos

• Cada vez que se produce un evento dicho evento se representa como una instancia de una clase descendiente de AWTEvent.

ActionEvent (1)

TextEvent (1)

AWTEvent

Object

EventObject

AdjustmentEvent (1)

ComponentEvent ItemEvent (1)

FocusEvent WindowEvent InputEvent ContainerEvent PaintEvent

KeyEvent MouseEvent

Page 28: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

Fuentes de eventos

• La fuente (source) de un evento es el objeto que lo detecta y lo comunica al objeto receptor (listener).

• Ejemplos de fuentes y eventos generados

Fuente Evento generado

Pulsación sobre un botón

Pulsa <Return> sobre un campo de texto

Pulsar sobre una opción de menú

ActionEvent

Cerrar la ventana principal de la aplicación WindowEvent

Pulsar con el ratón sobre un componente MouseEvent

Mover el ratón sobre un componente MouseEvent

Un componente se hace visible ComponentEvent

Page 29: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

Eventos generados por componentes AWT Componente Evento Significado

Button ActionEvent Pulsar el ratón sobre un botón

Checkbox ItemEvent Seleccionar o deseleccionar un item

CheckboxMenuItem ItemEvent

Choice ItemEvent

Component FocusEvent Obtener o perder el foco

ComponentEvent Mover, cambiar tamaño, mostrar u ocultar un componente

KeyEvent Pulsar o soltar un tecla

MouseEvent

Pulsar o soltar un botón del ratón, entrar o salir de un

componente, mover o arrastrar el ratón (tenga en cuenta que el

evento tiene 2 interfaces oyentes MouseListener y

MouseMotionListener)

Container ContainerEvent Añadir o eliminar un componente de un contenedor

List ActionEvent Hacer doble click sobre un item de la lista

ItemEvent Seleccionar o deseleccionar un item de la lista

MenuItem ActionEvent Seleccionar un item de un menú

Scrollbar AdjustmentEvent Cambiar el valor de la barra de desplazamiento

TextComponent TextEvent Cambiar el contenido (texto).

TextField ActionEvent Pulsar intro al editar un texto

Window WindowEvent Acciones sobre una ventana: abrir, cerrar, iconizar (minimizar),

restablecer, cerrar.

Page 30: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

Eventos generados por componentes Swing

• Los eventos generados por los componentes Swing son de dos tipos: – Una primera clase que engloba los oyentes que todos los componentes Swing

pueden soportar: • Component Listener: Oyentes para el cambio en el tamaño, posición o visibilidad de

un componente. • Focus Listener: Oyentes para manejar la perdida o ganancia de foco del teclado.

• Key Listener: Oyentes para detectar pulsaciones de teclado; los eventos de teclado son activados únicamente por el componente que tiene el foco del teclado.

• Mouse Listener: Oyentes para “clicks” del ratón, pulsar un botón del ratón, soltar un botón del ratón, entrar en el área de dibujo del componente, salir de la misma.

• Mouse-motion Listener: Cambiar la posición del cursor del ratón sobre un componente.

• Mouse-wheel Listener: Movimiento de la rueda del ratón sobre un componente. • Hierarchy Listener: Oyentes para los cambios en la jerarquía de un componente. • Hierarchy Bounds Listener: Oyentes para el cambio de posición y de tamaño.

– Una segunda clase que engloba oyentes específicos para cada tipo de componente.

Page 31: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

Oyentes específicos Componentes Swing con sus oyentes específicos

Oyente Componente

action caret change document,

undoable

edit

item list

selection window other

button

check box

color chooser

combo box

dialog

editor pane hyperlink

file chooser

formatted text

field

frame

internal frame internal frame

list list data

menu menu

menu item menu key

menu drag

mouse

Page 32: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

Oyentes específicos (2) Oyente Componente

action caret change document,

undoable edit item list

selection window other

password

field

popup menu Popup menu

progress bar

radio button

slider

spinner

tabbed pane

table table model

table column

table model, cell

editor

text area

text field

text pane hyperlink

toggle button

tree tree expansion

tree will expand

tree model

tree selection

Page 33: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

Interfaces receptoras

Evento Interfaz Listener Métodos de la Interfaz

ActionEvent ActionListener actionPerformed

AdjustmentEvent AdjustmentListener adjustmentValueChanged

ComponentEvent ComponentListener componentHidden, componentMoved,

componentResized, componentShown

ContainerEvent ContainerListener componentAdded,componentRemoved

FocusEvent FocusListener focusGained, focusLost

ItemEvent ItemListener itemStateChanged

KeyEvent KeyListener keyPressed,keyReleased,keyTyped

MouseEvent MouseListener mousePressed,mouseReleased, mouseEntered,

mouseExited.

MouseMotionListener mouseDragged, mouseMove

TextEvent TextListener textValueChanged

WindowEvent WindowListener windowActivated, windowClosed,

windowClosing,windowDeactivated, windowDeiconified,

windowIconified, windowOpened.

Page 34: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

Adaptadores • Los adaptadores (adapters class) simplifican la programación de

las clases receptoras ya que no es necesario implementar todos los métodos de las interfaces listeners.

• Existe una clase adaptadora (xxxAdapter) por cada interface (xxxListener) que contenga más de un método: MouseAdapter, WindowAdapter, KeyAdapter, MouseMotionAdapter, FocusAdapter, ContainerAdapter y ComponentAdapter, etc.

• Las clases adaptadoras implementan (mediante código vacío) todos los métodos de la correspondiente interfaz.

• Las adaptadoras se extienden y se incluyen los métodos de la interfaz que sean de interés.

Page 35: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

Programación del receptor: alternativas

• Se pueden utilizar tres estrategias:

1. Crear el receptor como clase interna, donde una clase interna es una clase definida dentro de otra, pudiendo acceder a todos los métodos y atributos de la clase que la contiene.

2. Crear el receptor como una clase independiente.

3. La propia ventana implemente el receptor.

Page 36: Programación Orientada a Objetos - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · • Los eventos generados por los componentes Swing son de dos tipos: ... simplifican

Listener usando Adapters

36

public class MyCloseWindow extends WindowAdapter() { public void windowClosing(WindowEvent e) {

int resp; resp=javax.swing.JOptionPane.showConfirmDialog (null, “¿Esta seguro de salir de la aplicación?", "Aviso", javax.swing.JOptionPane.OK_CANCEL_OPTION); if (resp==JOptionPane.OK_OPTION) System.exit(0);

} }

}); }

Ejemplo de clase para el cierre de la aplicación validando…