Tema 7. El AWT (Abstract Windows Toolkit) Introducción Creación interfaces gráficas Modelo de eventos Pasos creación aplicación Jerarquía de componentes y eventos Relación componentes – eventos Interfaces Listener Clases Adapter Descripción componentes y eventos Menús Layout Managers 1 Introducción AWT: Evolución: Biblioteca de clases para el desarrollo de interfaces gráficas de usuario Problema: La visualización de la interfaz gráfica depende de la plataforma Se introdujo en la versión 1.0 → entorno muy simple Mejora: Cambio en el modelo de eventos en la versión 1.1 Java2 → JFC (Java Foundation Classes) JFC: AWT + Java2D + Accesibilidad + Arrastrar y Soltar + Swing Swing: Extiende el AWT añadiendo JComponents. Presentación visual independiente de la plataforma. 2 Creación interfaces gráficas Contenedor (container) Componentes Ventana donde se situarán los componentes (botones, barras, ...) Menús, botones de comando, cajas de texto, barras de desplazamiento, ... Modelo de eventos Cada vez que el usuario realiza una acción, se produce un evento, que el S.O. transmite al AWT. El AWT crea un objeto de una clase de evento que se transmite a un método para que lo gestione El componente que recibe el evento debe registrar previamente qué objeto se va a encargar de gestionar ese evento 3 Modelo de eventos Los objetos sobre los que se producen los eventos (event sources) registran los objetos que habrán de gestionarlos (event listeners) Los event listeners habrán de disponer de los métodos adecuados, que serán llamados automáticamente cuando se produzca el evento Para que los event listeners dispongan de los métodos adecuados para gestionar los eventos, se les obliga a implementar una determinada interface Listener Interfaces Listener: se corresponden con los tipos de eventos que se pueden producir 4 Pasos creación aplicación (1) Crear una clase InterfazUsuario Constructor de la clase InterfazUsuario: 1. 2. 1. 2. 3. 4. 5. 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 Crear las clases encargadas de la gestión de eventos Crear la clase que contenga el main() 3. 4. 1. Crear un objeto de la clase InterfazUsuario 5 Pasos creación aplicación (2) 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 … 6 Pasos creación aplicación (3) public class EjemploAwt { public static void main(String arg[]) { InterfazUsuario ventana = new InterfazUsuario(); } } 7 Jerarquía de componentes java.lang.Object java.awt.Component Button, Canvas, Checkbox, Choice, Label, List, Scrollbar TextComponent TextArea, TextField Container Panel, ScrollPane Window Frame Dialog FileDialog 8 Componentes del AWT Cualquier Component (excepto Window y los que derivan de ella) debe ser añadido a un Container Para añadir un Component a un Container: nombreContainer.add(nombreComponente); Window es un Container de nivel máximo. Un Container puede ser añadido a otro Container Panel y ScrollPane debe estar dentro de otro Container Las clases pertenecen al package java.awt 9 Jerarquía de eventos java.lang.Object java.util.EventObject java.awt.AWTEvent ActionEvent, AdjustmentEvent, ItemEvent, TextEvent ComponentEvent ContainerEvent, FocusEvent, PaintEvent, WindowEvent InputEvent KeyEvent, MouseEvent Todos los eventos corresponden a clases de Java Las clases están agrupadas en el package java.awt.event 10 Tipos de eventos Eventos de alto nivel ActionEvent: Pinchar sobre botones o elegir comandos en menús AdjustmentEvent: Cambiar valores en barras de desplazamiento ItemEvent: Elegir valores TextEvent: Cambiar el texto Eventos de bajo nivel ComponentEvent: Mover, cambiar tamaño, mostrar u ocultar un componente ContainerEvent: Añadir o eliminar un componente del container KeyEvent: Pulsar o soltar una tecla MouseEvent: Mover, arrastrar, pulsar y soltar con el ratón FocusEvent: Obtener o perder el focus WindowEvent: Acciones sobre una ventana 11 Componentes y eventos (i) Component Eventos Significado Button ActionEvent Pinchar en el botón Checkbox ItemEvent Seleccionar o deseleccionar un item Choice ItemEvent Seleccionar o deseleccionar un item ComponentEvent Mover, cambiar tamaño, mostrar u ocultar un componente FocusEvent Obtener o perder el focus KeyEvent Pulsar o soltar una tecla MouseEvent Mover, arrastrar, pulsar y soltar con el ratón ContainerEvent Añadir o eliminar un componente de un container 12 Component Container Componentes y eventos (ii) Component Eventos Significado 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 scrollbar TextComponent TextEvent Cambiar el texto TextField ActionEvent Terminar de editar un texto pulsando Intro Window WindowEvent Abrir, cerrar, minimizar, ... 13 Interfaces Listener Cada objeto que puede recibir un evento (event source) registra uno o más objetos para que los gestionen (event listener): eventSourceObject.addEventListener(eventListenerObject); La clase del eventListenerObject deberá implementar una interface Listener determinada Esta interface proporcionará la declaración de los métodos que serán llamados cuando se produzca el evento La interface a implementar depende del tipo de evento Una vez registrado el objeto que gestionará el evento, se deberán definir todos los métodos de la interface. Algunos podrán dejarse vacíos 14 Interfaces Listener y eventos (i) Evento Interface Listener Métodos de Listener ActionEvent ActionListener actionPerformed() AdjustmentEvent AdjustmentListener adjustmentValueChanged() ComponentEvent ComponentListener componentHidden(), componentMoved(), componentResized(), componentShown() ContainerEvent ContainerListener componentAdded(), componentRemoved() FocusEvent FocusListener focusGained(), focusLost() ItemEvent ItemListener itemStateChanged() 15 Interfaces Listener y eventos (ii) Evento Interface Listener Métodos de Listener KeyEvent KeyListener keyPressed(), keyReleased(), keyTyped() MouseListener mouseClicked(),mouseEntered(), mouseExited(), mousePressed(), mouseReleased() MouseMotionListener mouseDragged(),mouseMoved() TextListener textValueChanged() WindowListener windowActivated(), windowDeactivated(), windowClosed(), windowClosing(), windowIconified(), windowDeiconified(), windowOpened() MouseEvent TextEvent WindowEvent 16 Ejemplo (i) 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()); } 17 Ejemplo (ii) 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){} }; 18 Ejemplo (iii) public class EjemploVentana { public static void main(String arg[]) { InterfazUsuario ventana = new InterfazUsuario(); } } 19 Clases Adapter Hay 7 clases Adapter: ComponentAdapter, ContainerAdapter, FocusAdapter, KeyAdapter, MouseAdapter, MouseMotionAdapter, WindowAdapter Son clases predefinidas que contienen definiciones vacías para todos los métodos de la interface Listener correspondiente Para crear un objeto que responda al evento, en vez de crear una clase que implemente la interface Listener, basta crear una clase que derive de la clase Adapter correspondiente y redefina los métodos de interés 20 Ejemplo class CerrarVentana extends WindowAdapter { public void windowClosing(WindowEvent we){ System.exit(0);} } 21 Usando una clase anónima 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 WindowAdapter(){ public void windowClosing(WindowEvent we){System.exit(0);}}); } 22 Clase Component Clase abstract de la que derivan todas las clases del AWT Sus métodos son heredados por todos los componentes del AWT Métodos interesantes: void setVisible(boolean) → muestra el componente Dimension getSize(), void setSize(int w, int h) Dimension posee 2 variables miembro: height y width void setBackground(Color), void setForeground(Color) void paint(Graphics), void repaint(), void update(Graphics) boolean isEnabled(), void setEnabled(boolean) 23 AWTEvent y ComponentEvent Clase AWTEvent: Hereda de EventObject el método: Object getSource(); Devuelve una referencia al objeto que generó el evento Clase ComponentEvent: Los eventos se generan cuando un Component se muestra, oculta o cambia de posición o tamaño Component getComponent() → devuelve el componente que generó el evento 24 Clase InputEvent De esta clase descienden los eventos del ratón y del teclado Define constantes para saber qué teclas o botones estaban pulsados: SHIFT_MASK, ALT_MASK, CTRL_MASK, BUTTON1_MASK, BUTTON2_MASK, BUTTON3_ MASK Métodos interesantes: boolean isShiftDown(), boolean isAltDown(), boolean isControlDown() int getModifiers() → obtiene una máscara de bits sobre las teclas y botones pulsados 25 Clase MouseEvent Se produce este evento: Los métodos de la interface MouseListener se relacionan con estas acciones, siendo: void mouseClicked(MouseEvent), void mouseEntered(MouseEvent), void mouseExited(MouseEvent), void mousePressed(MouseEvent), void mouseReleased(MouseEvent) Métodos interesantes de MouseEvent: Cuando el ratón entra o sale de un componente visible Al pinchar, al pulsar o soltar un botón Point getPoint(), int getX(), int getY() La interface MouseMotionListener está relacionada con el movimiento del ratón: void mouseMoved(MouseEvent), void mouseDragged(MouseEvent) 26 Clase Container Sus métodos son heredados por las clases Frame y Panel Los containers mantienen una lista de los objetos que se les añaden Métodos interesantes: Component add(Component) Component getComponent(int) void remove(Component), void remove(int), void removeAll() void setLayout(LayoutManager) 27 Clase ContainerEvent Los ContainerEvents se producen cada vez que un Component se añade o se retira de un Container Métodos: Component getChild() Devuelve el Component añadido o eliminado Container getContainer() Devuelve el Container que generó el evento 28 Clases Window y WindowEvent Clase Window Son ventanas de máximo nivel, pero sin bordes y sin barra de menús Son más interesantes las clases que derivan de ellas: Frame y Dialog Clase WindowEvent Se produce cuando se abre, cierra, minimiza, restaura, activa o desactiva una ventana La interface WindowListener indica los métodos para responder a este evento Su uso más frecuente es para cerrar ventanas El método Window getWindow() devuelve la ventana que generó el evento 29 Clases Frame y Dialog Clase Frame Ventana con borde que puede tener barra de menús Métodos interesantes: Frame(), Frame(String title) String getTitle(), void setTitle(String) void setMenuBar(MenuBar) Clase Dialog Ventana que depende de una Frame Existen diálogos modal y no modal (por defecto) Constructor: Dialog(Frame fr, String title, boolean mod) 30 Clase FileDialog Muestra una ventana de diálogo en la que se puede seleccionar un fichero Deriva de Dialog Las constantes enteras LOAD y SAVE definen el modo de apertura Métodos interesantes: FileDialog(Frame parent, String title, int mode) int getMode(), void setMode(int mode) String getDirectory(), String getFile() void setDirectory(String dir), void setFile(String file) 31 Clase Panel Es un Container de propósito general Constructores: Se puede utilizar para contener otras componentes Por defecto el Layout Manager es FlowLayout Los Applets son subclases de Panel Panel(), Panel(LayoutManager miLM) Un Panel puede contener otros Panel 32 Clase Button Al pinchar sobre un botón se genera un evento de la clase ActionEvent El aspecto depende de la plataforma, pero la funcionalidad es la misma Se puede cambiar el texto y la fuente que aparecen, así como el color de fondo y del texto Métodos: Button(String label), Button() void setLabel(String str), String getLabel() void addActionListener(ActionListener al) void setActionCommand(String cmd), String getActionCommand() → establece y recupera un nombre para el botón 33 Clase ActionEvent Estos eventos se producen: pinchar con el ratón en un botón elegir un comando de un menú hacer doble clic en un elemento de la lista pulsar Intro para introducir un texto en una caja de texto String getActionCommand() Al Al Al Al Devuelve el texto asociado con la acción que provocó el evento int getModifiers() Devuelve un entero representando una constante definida en ActionEvent (SHIFT_MASK, CTRL_MASK, META_MASK, ALT_MASK) Permite saber qué tecla se pulsó mientras se clicaba Ej: actionEvent.getModifiers() & ActionEvent.CTRL_MASK 34 Ejemplo Botón (1) class InterfazUsuario { public InterfazUsuario() { Button miBoton = new Button("Pulsame"); Frame miFrame = new Frame("Ventana en Java"); miFrame.setLayout(new FlowLayout()); miFrame.add(miBoton); miFrame.setSize(450,150); miFrame.setVisible(true); GestorBoton miGestor = new GestorBoton(); miBoton.addActionListener(miGestor); miFrame.addWindowListener(new CerrarVentana()); } }; 35 Ejemplo Botón (2) class GestorBoton implements ActionListener { public void actionPerformed(ActionEvent evt){ System.out.println("Boton pulsado"); } }; class CerrarVentana extends WindowAdapter { public void windowClosing(WindowEvent we){ System.exit(0);} }; public class EjemploAwt { public static void main(String arg[]) { InterfazUsuario ventana = new InterfazUsuario(); } } 36 Clase Canvas (1) Un Canvas es una zona en la que se puede dibujar y mostrar imágenes. Constructor: Canvas() Métodos paint(): contendrá el código para dibujar repaint(): llama a paint() Eventos No tiene eventos propios Los hereda de Component 37 Clase Canvas (2) class MiCanvas extends Canvas { }; public void paint(Graphics g) { g.drawLine(10,10,100,100); } class InterfazUsuario { public InterfazUsuario() { … MiCanvas c = new MiCanvas(); … c.repaint(); }; } 38 Clases Checkbox y CheckboxGroup Clase Checkbox: Los objetos de Checkbox son botones de opción con 2 posibles valores: on y off Al cambiar la selección de un Checkbox se produce un ItemEvent Cuando el usuario actúa sobre un Checkbox se ejecuta el método itemStateChanged() → método de la interface ItemListener Clase CheckboxGroup: Permite agrupar varios Checkbox de modo que sólo uno esté en on Checkbox(String,boolean,CheckboxGroup) Al seleccionar un Checkbox de un grupo se producen 2 eventos: 1 por el elemento que se ha seleccionado y otro por el que ha perdido la selección 39 Clase ItemEvent Se produce cuando cambian de estado: Checkbox CheckboxMenuItem Choice List Estos componentes implementan la interface ItemSelectable Métodos: ItemSelectable getItemSelectable() → devuelve el objeto ItemSelectable donde se originó el evento int getStateChange() → devuelve la constante SELECTED o DESELECTED 40 Clase Choice Permite elegir un ítem de una lista desplegable Genera el evento ItemEvent al seleccionar un ítem de la lista Un índice permite determinar un elemento de la lista (se empieza desde 0) Métodos: Choice() void add(String) void insert(String,int) int getSelectedIndex(), String getSelectedItem() String getItem(int) void select(int), void select(String) void removeAll(), void remove(int), void remove(String) 41 Clase Label Introduce en un container un texto no seleccionable y no editable Define las constantes CENTER, LEFT y RIGHT para alinear el texto Métodos: Label(String), Label(String,int) void setAlignement(int), int getAlignement() void setText(String), String getText() 42 Clase List Se diferencia de Choice en que se muestran varios ítems a la vez y se permite la selección múltiple Eventos que generan: ActionEvent → al pinchar 2 veces sobre un ítem o al pulsar return ItemEvent → al seleccionar o deseleccionar un ítem (al gestionarlo se puede consultar si el usuario estaba pulsando alguna tecla para hacer una selección múltiple) Métodos: List(), List(int nl), List(int nl, boolean mult) void add(String), void add(String,int) int getSelectedIndex(), int[] getSelectedIndexes(), String getSelectedItem(), String[] getSelectedItems() 43 Clase Scrollbar Barra de desplazamiento: Constantes: HORIZONTAL, VERTICAL → indican la posición de la barra Al cambiar el valor de la Scrollbar se produce un AdjustmentEvent Posee un cursor que permite introducir y modificar valores Define un rango entre un mínimo y un máximo Permite incrementos pequeños y grandes Se ejecuta el único método de la interface AdjustmentListener → adjustmentValueChanged() Métodos: Scrollbar(), Scrollbar(int pos) int getValue(), void setValue() 44 Clase AdjustmentEvent Se produce cada vez que se cambia el valor de una Scrollbar. Tipos: TRACK: se arrastra el cursor UNIT_INCREMENT, UNIT_DECREMENT: se pincha en las flechas BLOCK_INCREMENT, BLOCK_DECREMENT: se pincha delante o detrás del cursor Métodos: Adjustable getAdjustable() → devuelve el Component que generó el evento int getAdjustementType() → devuelve el tipo de evento int getValue() → devuelve el valor de la barra 45 Clase ScrollPane Ventana en la que se puede mostrar un componente de mayor tamaño con 2 Scrollbars (horizontal y vertical) Constantes: SCROLLBARS_AS_NEEDED (defecto), SCROLLBARS_ALWAYS, SCROLLBARS_NEVER No genera eventos Métodos: ScrollPane(), ScrollPane(int) void setScrollPosition(int x, int y), void setScrollPosition(Point p), Point getScrollPosition() → establece u obtiene la posición del componente 46 Clases TextArea y TextField Heredan de TextComponent y muestran texto seleccionable y editable TextField sólo puede tener 1 línea. Ej: TextField t=new TextField(“Hola”); t.setText(“otro texto”); TextArea puede tener varias líneas. Ej: TextArea ta=new TextArea(“area de texto”, 10,20); ta.append(“añade más texto”); ta.setText(“sustituye texto”); Eventos: TextField genera ActionEvents → se produce cuando el usuario pulsa Intro TextField y TextArea pueden recibir TextEvents(de TextComponent) → se produce cada vez que se modifica el texto Pueden recibir los eventos de Component: FocusEvent, MouseEvent y KeyEvent 47 Clases TextEvent y KeyEvent Clase TextEvent: Se produce al modificarse el texto La interface TextListener tiene un único método: void textValueChanged(TextEvent te) Clase KeyEvent: Se produce al pulsar sobre el teclado. Hay dos tipos de KeyEvent: KEY_TYPED: introducción de un carácter Unicode KEY_PRESSED y KEY_RELEASED: pulsar o soltar una tecla VKC(Virtual KeyCodes): constantes que se corresponden con las teclas físicas del teclado (sin minúsculas). Se indican con el prefijo VK (ef: VK_A) → vienen definidas como ctes. char getKeyChar(), int getKeyCode() 48 Ejemplo TextField (1) class InterfazUsuario { public InterfazUsuario() { Button miBoton = new Button("Pulsame"); TextField miCampoTexto = new TextField("Texto inicial"); Frame miFrame = new Frame("Ventana en Java"); miFrame.setLayout(new FlowLayout()); miFrame.add(miBoton); miFrame.add(miCampoTexto); miFrame.setSize(450,150); miFrame.setVisible(true); GestorBoton miGestor = new GestorBoton(miCampoTexto); miBoton.addActionListener(miGestor); miFrame.addWindowListener(new CerrarVentana()); } }; 49 Ejemplo TextField (2) class GestorBoton implements ActionListener { TextField campoTexto; public GestorBoton(TextField txt) { campoTexto=txt; } }; public void actionPerformed(ActionEvent evt) { campoTexto.setText("Boton pulsado"); } 50 Menús java.lang.Object java.awt.MenuComponent MenuBar MenuItem CheckboxMenuItem Menu PopupMenu 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 51 Clase MenuShortcut Representa las teclas aceleradoras que pueden utilizarse para activar los menús desde teclado 1. 2. Se establece un Shortcut con el constructor MenuShortcut(int vk_key) Se le pasa al constructor de MenuItem Los menús están restringidos al uso de la tecla CTRL (no se incluye en el constructor) 52 Clases MenuBar y Menu Clase MenuBar Se le añaden objetos Menu MenuBar() void add(Menu) void remove(int index), void remove(MenuComponent m) Clase Menu Se le pueden introducir objetos MenuItem, Menu, CheckboxMenuItem y separadores Menu(String) void add(String), void add(MenuItem), void addSeparator(), void insertSeparator(int index) 53 Clase MenuItem Representan las opciones del menú Eventos: Al seleccionar un objeto MenuItem se generan eventos del tipo ActionEvent Para cada ítem de un Menu se puede definir un ActionListener, que define el método actionPerformed() Métodos: MenuItem(String), MenuItem(String,MenuShortcut) String getLabel(), void setLabel(String) void setShortcut(MenuShortcut) 54 Clase CheckboxMenuItem Son items de un menú que pueden estar activados o no. Genera un ItemEvent(como la clase Checkbox) Métodos: CheckboxMenuItem(String, [boolean]) boolean getState(), void setState(boolean) 55 Ejemplo Menu (1) Constructor InterfazUsuario: MenuItem mnuItemAbrir = new MenuItem("Abrir"); MenuItem mnuItemSalir = new MenuItem("Salir"); GestorMenuArchivo gestorMenu = new GestorMenuArchivo(); mnuItemAbrir.addActionListener(gestorMenu); mnuItemSalir.addActionListener(gestorMenu); Menu mnuArchivo = new Menu("Archivo"); mnuArchivo.add(mnuItemAbrir); mnuArchivo.addSeparator(); mnuArchivo.add(mnuItemSalir); MenuBar mnuBar = new MenuBar(); mnuBar.add(mnuArchivo); Frame miFrame = new Frame("Ejemplo menu"); miFrame.setSize(250,250); miFrame.setMenuBar(mnuBar); miFrame.setVisible(true); miFrame.addWindowListener(new CerrarVentana()); 56 Ejemplo Menu (2) class GestorMenuArchivo implements ActionListener { public void actionPerformed (ActionEvent evt) { String item = ((MenuItem)evt.getSource()).getLabel(); if (item == "Salir") { System.exit(0); } else{ System.out.println(item); } } } 57 Menús emergentes Son menús que aparecen al pulsar con el botón dcho. del ratón sobre un Component Métodos: PopupMenu(), PopupMenu(String title) void show(Component origin, int x, int y) Se pueden utilizar los métodos de la clase Menu Para mostrar el menú: Registrar el MouseListener Definir el método mouseClicked() 58 Ejemplo emergente (1) public InterfazUsuario(): MenuItem mnuItemAbrir = new MenuItem("Abrir"); MenuItem mnuItemSalir = new MenuItem("Salir"); GestorMenuArchivo gestorMenu = new GestorMenuArchivo(); mnuItemAbrir.addActionListener(gestorMenu); mnuItemSalir.addActionListener(gestorMenu); PopupMenu mnuArchivo = new PopupMenu("Archivo"); mnuArchivo.add(mnuItemAbrir); mnuArchivo.addSeparator(); mnuArchivo.add(mnuItemSalir); Frame miFrame = new Frame("Ejemplo menu"); miFrame.add(mnuArchivo); miFrame.setSize(250,250); miFrame.setVisible(true); miFrame.addMouseListener(new GestorRaton(miFrame,mnuArchivo)); miFrame.addWindowListener(new CerrarVentana()); 59 Ejemplo emergente (2) class GestorRaton extends MouseAdapter { Frame unFrame; PopupMenu unMenuPopup; GestorRaton(Frame frame, PopupMenu menuPopup) { unFrame = frame; unMenuPopup = menuPopup; } public void mousePressed(MouseEvent evt) { if((evt.getModifiers() & MouseEvent.BUTTON3_MASK) != 0){ unMenuPopup.show(unFrame,evt.getX(),evt.getY()); } } }; 60 Layout Managers Un Layout Manager es un objeto que controla cómo los Components se sitúan en un Container AWT define 5: FlowLayout y GridLayout (sencillos) BorderLayout y CardLayout (especializados) GridBagLayout (general) Todos los Containers tienen uno por defecto: Necesario por la portabilidad FlowLayout para Panel BorderLayout para Window (Frame y Dialog) Métodos: unContainer.setLayout(new GridLayout()); 61 FlowLayout Coloca los componentes una detrás de otro, de izda. a dcha. y de arriba abajo Si se cambia el tamaño de la ventana los componentes se redistribuyen Constructores: FlowLayout(); FlowLayout(int alignement); FlowLayout(int alignement, int horGap, int verGap); Alineación: LEFT, CENTER, RIGHT Distancia horizontal y vertical entre componentes → 5 píxeles por defecto Añadir componentes: miFrame.add(new Button(“Button 1”)); miFrame.add(new Button(“2”)); … 62 BorderLayout Define 5 áreas: Los componentes añadidos en cada zona tratan de ocupar todo el espacio disponible Constructores: North, South, East, West y Center BorderLayout(); BorderLayout(int horGap, int verGap) Al añadir un componente se debe especificar la zona: miFrame.add(new Button(“North”),“North”); miFrame.add(new Button(“South”), BorderLayout.SOUTH); … 63 GridLayout Los componentes se colocan en una matriz de celdas Constructores: Todas las celdas tienen el mismo tamaño Cada componente utiliza todo el espacio disponible en su celda GridLayout(int nfil,int ncol); GridLayout(int nfil,int ncol, int horGap, int verGap); Añadir componentes: miFrame.add(new Button(“Button 1”)); miFrame.add(new Button(“2”)); … miFrame.add(new Button(“Button 5”)); 64 CardLayout Permite disponer distintos componentes que compartan la misma ventana para ser mostrados sucesivamente Es similar a “cartas” que van apareciendo una tras otra. Se puede establecer el orden en que se muestran Constructores: Para añadir componentes: CardLayout(), CardLayout(int horGap, int verGap) unContainer.add(Component comp, int index) Para controlar el orden en que aparecen las cartas: void first(Container), void last(Container), void previous(Container), void next(Container), void show(Container, String) 65 Ejemplo CardLayout Ejemplo: CardLayout miCard=new CardLayout(); Panel p=newPanel(); p.setLayout(miCard); p.add(new Button(“Primera carta”), “primera”); p.add(new TextField(“Segunda carta”), “segunda”); Mostrar la primera: miCard.first(p); Mostrar siguiente: miCard.next(p); Mostrar por nombre: miCard.show(p, “segunda”); 66 GridBagLayout (i) Es el más completo y flexible Parte de una matriz de celdas Las filas pueden tener distinta altura y las columnas distinta anchura Una componente puede ocupar varias celdas La posición y tamaño de cada componente se especifica por medio de restricciones (constraints) Las restricciones se establecen creando un objeto de la clase GridBagConstraints, dando valor a sus propiedades y asociando el objeto con el componente mediante el método setConstraints() 67 GridBagLayout (ii) Variables miembro de GridBagConstraints: int gridx, gridy → fila y columna en la que se sitúa la esquina superior izquierda del componte int gridwidth, gridheight → nº de filas y columnas que ocupa el componente Ejemplo: GridBagLayout unGBL = new GridBagLayout(); GridBagConstraints unasConstr = new GridBagConstraints(); unContainer.setLayout(unGBL); // Se crea un componente unComp // Se establecen las propiedades de unasConstr unGBL.setConstraints(unComp,unasContr); unContainer.add(unComp); 68 Combinación layouts 69 Combinación layouts class InterfazUsuario { public InterfazUsuario() { Panel miPanel = new Panel (new FlowLayout()); miPanel.add(new Button("1")); miPanel.add(new Button("2")); miPanel.add(new Button("3")); TextArea texto=new TextArea(); Frame miFrame = new Frame("Ventana en Java"); miFrame.setLayout(new BorderLayout()); miFrame.add(texto, BorderLayout.CENTER); miFrame.add(miPanel,BorderLayout.SOUTH); miFrame.setSize(450,150); miFrame.setVisible(true); miFrame.addWindowListener(new CerrarVentana()); } }; 70 Combinación layouts 71 Combinación layouts class InterfazUsuario { public InterfazUsuario() { MiCanvas miObjCanvas=new MiCanvas(); TextArea txtArea=new TextArea(); txtArea.setEditable(false); Panel panelCentral = new Panel (new GridLayout(1,2)); panelCentral.add(txtArea); panelCentral.add(miObjCanvas); TextField txtDatos=new TextField("",40); Button bot1=new Button("Botón 1"); Button bot2=new Button("Botón 2"); bot2.setEnabled(false); Panel panelInferior=new Panel(new FlowLayout()); panelInferior.add(txtDatos); panelInferior.add(bot1); panelInferior.add(bot2); 72 Combinación layouts }; } Frame miFrame = new Frame("Ventana en Java"); miFrame.setLayout(new BorderLayout()); miFrame.add(panelCentral, BorderLayout.CENTER); miFrame.add(panelInferior,BorderLayout.SOUTH); miFrame.setSize(450,150); miFrame.setVisible(true); miFrame.addWindowListener(new CerrarVentana()); 73