Indice Administradores de diseño avanzados Interfaz Gráfica de Usuario (GUI) Uso de menús Unidad: 2 Laboratorio de Programación Menu MenuBar MenuItem Ejemplos Gestión de eventos Pasos para la creación de una aplicación Universidad Nacional de la Patagonia Austral Unidad Académica Río Gallegos CardLayout GridBagLayout Ejemplos GUI Repaso Ejemplos Laboratorio de Programacion 1 CardLayout Administradores de diseño avanzados Layouts Managers GUI CardLayout: pasos GUI Component add(String label, Component c); Usar los métodos next(), previous(), first() o show() pertenecientes a la clase CardLayout para poder visualizar el panel correspondiente. Laboratorio de Programacion Laboratorio de Programacion 3 CardLayout: métodos Crear un panel que tenga por administrador a CardLayout. Crear los diferentes paneles que contendrá nuestra aplicación, insertando, claro está, los componentes necesarios en cada panel. Añadir mediante el método add() de la clase Container los paneles creados, al panel cuyo administrador es CardLayout. En el método add se asigna una etiqueta al componente gestionado: Este administrador es el único que permite cambiar los componentes en pantalla en tiempo de ejecución. Su potencia radica en el uso de paneles. Podremos en un instante determinado visualizar uno de los paneles dejando los otros paneles sin visualizar. 4 GUI Constructores CardLayout CardLayout() CardLayout(int distancia_h, int distancia_v) Métodos de CardLayout first(Container padre) Visualiza el primer contenedor. last(Container padre) Visualiza el último contenedor. next(Container padre) Visualiza el siguiente contenedor. show(Container padre, String nombre) Visualiza un contenedor específico. Laboratorio de Programacion 5 1 CardLayout CardLayout: ejemplo Ejemplo: Ejemplo: … CardLayout layout = new CardLayout(); setLayout(layout); Button b1 = new Button(“Primer Boton"); Button b2 = new Button(“Segundo Botón"); add(“primero",b1); add(“segundo",b2); ActionListener al = new ActionListener() { public void actionPerformed(ActionEvent ev) { layout.next(this); } }; b1.addActionListener(this); b2.addActionListener(this); GUI Laboratorio de Programacion 6 CardLayout: ejemplo Mostrar la última: Mostrar por nombre: miCard.last(p); miCard.show(p, “segundo”); Laboratorio de Programacion 8 GridBagLayout: clase GridBagConstraints GUI Los componentes, pueden tener diferente tamaño. Los componentes pueden ocupar más de una celda. Los componentes se pueden agregar en cualquier orden. GUI Laboratorio de Programacion 9 GridBagLayout/ GridBagConstraints Esta clase especifica las restricciones de los componentes que serán colocados en un GridBagLayout. Las propiedades son: setConstraints(Component comp, GridBagConstraints gbc); gridx: Columna en la cual se pone al componente. gridy: Fila en la cual se pone al componente. fill: Como rellenar el espacio si la celda es mayor que el componente. Los valores posibles son: GridBagConstraints.NONE/HORIZONTAL/VERTICAL/BOTH anchor: Posición del componente dentro de la celda: NORTH, NORTHWEST, CENTER, etc. insets (int top, int left, int bottom, int right) : es el margen que tienen los componentes dentro de la celda. gridwidth: Número de columnas que un componente ocupa. gridheight: Número de filas que un componente ocupa. Laboratorio de Programacion 7 Similar al GridLayout, con las diferencias siguientes: miCard.next(p); GUI miCard.first(p); Mostrar siguiente: Laboratorio de Programacion GridBagLayout Mostrar la primera: GUI 10 GUI Ejemplo: Laboratorio de Programacion 11 2 GridBagLayout: ejemplo GridBagLayout: ejemplo … GridBagLayout layout = new GridBagLayout(); setLayout(layout); GridBagConstraints c = new GridBagConstraints(); Button b1 = new Button("uno"); Button b2 = new Button("dos"); Button b3 = new Button("tres"); Button b4 = new Button("cuatro"); … c.gridx = 0; c.gridy = 1; c.gridwidth = 1; c.fill = GridBagConstraints.BOTH; layout.setConstraints(b2,c); add(b2); c.gridx = 0; c.gridy = 0; c.gridwidth = 2; c.fill = GridBagConstraints.BOTH; layout.setConstraints(b1,c); add(b1); c.gridx = 0; c.gridy = 2; // el valor de c.gridwidth era 1 c.fill = GridBagConstraints.BOTH; layout.setConstraints(b3,c); add(b3); GUI Laboratorio de Programacion 12 GUI Laboratorio de Programacion 13 GridBagLayout: ejemplo… …c.gridx = 1; c.gridy = 1; // el valor de c.gridwidth era 1 c.gridheight = 2; c.fill = GridBagConstraints.BOTH; layout.setConstraints(b4,c); add(b4); Uso de Menu en los frames // fin codigo GUI Laboratorio de Programacion 14 Menu Los frames pueden tener barra de menús. Constructor: crear una barra de menús: Menu… MenuBar(); Añadir una barra de menús a un frame: Constructor: void setMenuBar(MenuBar mb); Añadir un menu a una barra de menús: GUI Laboratorio de Programacion 16 GUI Menu(); Menu(String menuLabel); Menu(String menuLabel,boolean allowTearoff); Menu add(Menu m); Laboratorio de Programacion 17 3 Menu… Menu… Creación de un menú: 1º se crea una MenuBar, después se crean los Menus y los MenuItem Los MenuItems se añaden al Menu, los Menus se añaden a la MenuBar y la MenuBar se añade a un Frame Puede añadirse un Menu a otro Menu GUI Laboratorio de Programacion Frame myFrame = new Frame(); // Crear barra de menús MenuBar myMenuBar = new MenuBar(); // Añadir la barra de menús al frame myFrame.setMenuBar(myMenuBar); // Crear menú Menu fileMenu = new Menu("File"); // Añadir menú a barra de menús myMenuBar.add(fileMenu); 18 Menu… GUI Para añadir un separador al menú usar: Los menús pueden contener entradas de tipo Checkbox: void addSeparator(); La colocación de los menús en la barra es de izquierda a derecha. Puede crearse un único menú en el lado derecho (normalmente de ayuda) con: GUI Laboratorio de Programacion 20 Menu: ejemplo GUI Ejemplo: menú de Archivo Laboratorio de Programacion void setHelpMenu(Menu helpMenu); Laboratorio de Programacion 21 Menu: ejemplo… Ejemplo: los menús Edición y Ayuda // Menu Edicion Menu me = new Menu("Edicion"); CheckboxMenuItem cmi = new CheckboxMenuItem("mayus"); me.add(cmi); Menu ma = new Menu("Archivos"); ma.add("Abrir"); MenuItem save = new MenuItem("Salvar"); ma.add(save); save.setEnabled(false); ma.addSeparator(); Menu sm = new Menu("Submenu"); ma.add(sm); sm.add("opcion 1"); sm.add("opcion 2"); GUI CheckboxMenuItem(String itemLabel); boolean getState(); void setState(boolean newState); saveMenuItem.setEnabled(false); Menu printSubmenu = new Menu("Print"); fileMenu.add(printSubmenu); printSubmenu.add("Print Preview"); printSubmenu.add("Print Document"); Constructor: Metodos: Las entradas del menú pueden habilitarse o deshabilitarse: 19 Creando un submenú: fileMenu.add("Open"); MenuItem saveMenuItem = new MenuItem("Save"); fileMenu.add(saveMenuItem); Laboratorio de Programacion Menu… Las entradas del menú se pueden añadir directamente, o creando un MenuItem: Ejemplo: // Menu Ayuda Menu help = new Menu("Ayuda"); help.add("ayuda"); 22 GUI Laboratorio de Programacion 23 4 Menu: ejemplo… Ejemplo: ventana y barra de menús Gestión de Eventos // una ventana nueva Frame f = new Frame(); // Barra de menus de la ventana MenuBar mb = new MenuBar(); f.setMenuBar(mb); // añadir menu de archivos, edicion y ayuda mb.add(ma); mb.add(me); mb.setHelpMenu(help); GUI Laboratorio de Programacion 24 Eventos Eventos: Funcionamiento Los eventos representan la actividad entre el sistema, los programas y los usuarios. Se definen varios tipos de eventos. Normalmente: Cuando se produce un evento: Laboratorio de Programacion 26 Tipos de Eventos El generador invoca un método en todos los objetos escuchadores registrados. El método que se invoca depende del tipo de evento. Estos métodos se definen en varias interfaces llamadas escuchadoras. GUI componentes generan eventos en respuesta a las acciones de los usuarios. objetos del usuario escuchan y atienden los eventos generados. Las clases escuchadoras implementan interfaces escuchadoras. GUI Laboratorio de Programacion 27 Eventos: funcionamiento… Los objetos escuchadores deben registrarse en los generadores. addXXX y removeXXX XXX es el nombre de la interfaz escuchadora Ejemplo: boton.addActionListener(obj_escuchador); boton.removeActionListener(obj_escuchador); GUI Laboratorio de Programacion 28 GUI Laboratorio de Programacion 29 5 Métodos GUI Métodos… Laboratorio de Programacion 30 Tabla resumen GUI Laboratorio de Programacion 31 Tabla resumen… Component Eventos generados Interfaz Listener Adapter Métodos Component Eventos generados Interfaz Listener Adapter Métodos Button ActionEvent ActionListener actionPerformed Container ContainerEvent ItemEvent ItemListener itemStateChanged ContainerListener ContainerAdapter 2 metodos Checkbox Choice ItemEvent ItemListener itemStateChanged ActionEvent ActionListener actionPerformed ComponentEvent ComponentListener ComponentAdapter 4 metodos List ItemEvent ItemListener itemStateChanged FocusEvent FocusListener FocusAdapter 2 metodos MenuItem ActionEvent ActionListener actionPerformed AdjustementListener adjustmentValueChanged KeyListener KeyAdapter 3 metodos Scrollbar AdjustementEvent KeyEvent MouseListener MouseAdapter 5 metodos TextComponent TextEvent TextListener textValueChanged MouseMotionListener MouseMotionAdapter 2 metodos Component MouseEvent GUI Laboratorio de Programacion 32 Eventos ActionEvent actionPerformed Window WindowEvent WindowListener WindowAdapter 7 metodos GUI Clase de evento: ItemEvent Debe implementarse el interfaz ItemListener. Métodos de la clase ItemEvent: 33 Tiene un único método: void actionPerformed(ActionEvent event); void itemStateChanged(ItemEvent event) // Checkbox, CheckboxMenuItem y Choice: // objeto donde ocurrio el evento ItemSelectable getItemSelectable() // List: indice elemento seleccionado o deseleccionado. // Checkbox, CheckboxMenuItem y Choice: etiqueta elemento. Object getItem() // Checkbox, CheckboxMenuItem y Choice: estado // Estados validos: ItemEvent.SELECTED, // ItemEvent.DESELECTED int getStateChange() String getActionCommand(); devuelve la etiqueta del generador Object getSource(); Devuelve objeto donde se genero el evento. Laboratorio de Programacion Laboratorio de Programacion Método de EventObject: GUI ActionListener Método de ActionEvent: ActionEvent Eventos ItemEvent Clase de evento: ActionEvent. Debe implementarse el interfaz ActionListener. Tiene un único método: TextField 34 GUI Laboratorio de Programacion 35 6 Ejemplo Ejemplo… class InterfazUsuario { public InterfazUsuario() { // Se crea una ventana Frame miFrame = new Frame("Ventana en Java"); miFrame.setLayout(new FlowLayout()); miFrame.setSize(450,150); miFrame.setVisible(true); // Se registran los receptores de eventos miFrame.addWindowListener(new CerrarVentana()); } } GUI Laboratorio de Programacion class CerrarVentana implements WindowListener { public void windowActivated(WindowEvent we){} public void windowClosed(WindowEvent we){} public void windowClosing(WindowEvent we){ System.exit(0); } public void windowDeactivated(WindowEvent we){} public void windowDeiconified(WindowEvent we){} public void windowIconified(WindowEvent we){} public void windowOpened(WindowEvent we){} }; 36 Ejemplo… GUI Laboratorio de Programacion Clases Adaptadoras public class EjemploVentana { public static void main(String arg[]) { InterfazUsuario ventana = new InterfazUsuario(); } } Existen clases adaptadoras cuyo objetivo es evitar que las clases escuchadoras tengan que implementar todo el interfaz escuchador. Las clases adaptadoras implementan los métodos de las interfaces escuchadoras con un cuerpo vacío. GUI 37 Laboratorio de Programacion 38 Clases Adaptadoras: ejemplo GUI Así, las clases escuchadoras sólo tienen que extender a los adaptadores y redefinir únicamente el cuerpo de los métodos que necesitan. Laboratorio de Programacion 39 Pasos creación aplicación (1) 1. Crear una clase InterfazUsuario 2. Constructor de la clase InterfazUsuario: 1. 2. class CerrarVentana extends WindowAdapter { public void windowClosing(WindowEvent we){ System.exit(0);} } 3. 4. 5. 3. Crear las clases encargadas de la gestión de eventos 4. Crear la clase que contenga el main() 1. GUI Laboratorio de Programacion Crear componentes (botones, cajas de texto…) Crear ventana (objeto de la clase Frame) Asignar distribución a la ventana Añadir componentes a la ventana y mostrarla Registrar los gestores de eventos 40 GUI Crear un objeto de la clase InterfazUsuario Laboratorio de Programacion 41 7 Pasos creación aplicación (2) Pasos creación aplicación (3) import java.awt.*; import java.awt.event.*; class InterfazUsuario { public InterfazUsuario() { // Crear componentes // Crear ventana Frame miFrame = new Frame("Ventana en Java"); miFrame.setLayout(new FlowLayout()); // Añadir componentes a la ventana miFrame.add(…); // Dar tamaño y mostrar ventana miFrame.setSize(450,150); miFrame.setVisible(true); // Registrar gestores de eventos … } }; GUI Laboratorio de Programacion public class EjemploAwt { public static void main(String arg[]) { InterfazUsuario ventana = new InterfazUsuario(); } } 42 Próxima clase GUI GUI Laboratorio de Programacion 43 Consultas… Ultima teoría Repaso general Herramienta Eclipse Visual Editor Ejercitación Laboratorio de Programacion 44 GUI Laboratorio de Programacion 45 8