¡Descarga Interfaz grafica en java y más Diapositivas en PDF de Programación Java solo en Docsity!
Construcción de Interficies
Gráficas en Java
Projecte de Programació (PROP)
AWT – Abstract Window Toolkit
- Parte de Java que gestiona las interficies gráficas
- Resto de gestores de interficies se basan o relacionan con
AWT
- Conceptos básicos:
- Componentes: objetos y contenedores de la interficie
- Layout Managers: regulan la distribución de componentes en contenedores
- Eventos: transmitidos por el sistema operativo al AWT cuando el usuario realiza una acción
AWT: Componentes
- Componentes contenedores:
- Contenedores principales: No pueden estar dentro de otro contenedor - Frame: el contenedor más importante
- Dialog: depende de un frame – dialog modal
- Contenedores secundarios: Han de estar dentro de otro contenedor Pueden contener a otros contenedores secundarios - Panel (Applet es subclase de él), ScrollPane
AWT: Componentes
- Reglas de funcionamiento:
- Un componente sólo puede estar en un contenedor
- Interficie funcional: hay que tener un contenedor principal, y hacerlo visible: miContainer.setVisible(true)
- Añadir un componente a un contenedor: miContainer.add(miComponent)
- Eliminar un componente de un contenedor: miContainer.remove(miComponent)
- Una interficie funcional será un árbol n-ario:
- Raíz: un Frame
- Nodos intermedios: contenedores secundarios
- Hojas: componentes primarios
AWT: Eventos
SO
AWT método gestor
(interface Listener)
- Asociar a cada componente C un objeto (o varios) L ( interface
Listener).
- L^ define un método^ M^ que recibe como parámetro un objeto subclase
de AWTEvent.
- M^ se ejecuta cuando se produce el evento.
- AWTEvent evento
AWT: Eventos public class MiClase() { // En alguna parte de la clase (al crearla, por ejemplo) public MiClase() { ... // Crea el listener del evento ListenerBoton miListenerBoton = new ListenerBoton(); // Asocia el listener al boton miBoton.addActionListener(miListenerBoton); ... } ... // La clase ListenerBoton es privada private class ListenerBoton implements ActionListener { public void actionPerformed (ActionEvent event) { System.exit(0); // CODIGO ASOCIADO AL EVENTO } } }
AWT: Eventos
- De bajo nivel: operaciones elementales con ratón, teclado, contenedores y ventanas
- De alto nivel: operaciones con un significado en el contexto gráfico
- Clickar en un botón
- Cambiar las barras de desplazamiento
- Elegir un valor entre varios
- Cambiar un texto
AWT: Componentes vs Eventos
AWT: Menús
- Se pueden asociar a un contenedor principal en forma de
“barra de menú”. 3 clases:
- MenuItem: opción que permite la ejecución de una acción
- Menu: agrupa varios MenuItem u otros Menus
- MenuBar: barra en el contenedor principal
- Casos particulares:
- CheckboxMenuItem: items que se pueden activar o no
- PopupMenu: aparecen al hacer click con el botón derecho del ratón
AWT: Menús
- Para tener una barra de menús funcional:
- Crear los elementos de cada tipo MenuItem miMenuItem = new MenuItem(“Menu Option”); Menu miMenu = new Menu(“Menu Name”); MenuBar miMenuBar = new MenuBar();
- Asociarlos entre sí (operación add) miMenu.add(miMenuItem); miMenuBar.add(miMenu);
- Asociar la MenuBar al contenedor principal miFrame.setMenuBar(miMenuBar);
- Asociar un ActionListener a cada MenuItem miMenuItem.addActionListener (new ActionListener() { public void actionPerformed(ActionEvent event) { … // Codigo asociado al evento } });
AWT: Event-dispatching Thread
- En una aplicación basada en interficie gráfica, sólo el lanzamiento de la vistaPrincipal se hace desde el thread inicial
- public static void main (String args[]) { vistaPrincipal = new VistaPrincipal(); ... // Inicializaciones vistaPrincipal.hacerVisible(); System.out.printl(“Seguramente no tiene sentido poner nada aquí…”); }
- A partir de ese momento toman el control los Listeners asociados a los componentes gráficos: event-dispatching thread
- Si se quiere que alguna tarea costosa se ejecute sin dejar la parte gráfica bloqueada, se puede crear uno o más working threads
AWT: Event-dispatching Thread
- Si se quiere ejecutar todo desde el event-dispatching thread, se puede crear un objeto de la interficie Runnable y “encolarlo” en él: public static void main (String args[]) { java.awt.EventQueue.invokeLater ( new Runnable() { public void run() { vistaPrincipal = new VistaPrincipal(); ... // Inicializaciones vistaPrincipal.hacerVisible(); } } ); }
Swing vs AWT
- Componentes primarios y contenedores secundarios heredan de
JComponent:
- Componentes primarios: JButton, JMenuItem, JComboBox, JFileChooser, JLabel, JList, JMenuBar, JScrollBar, JTextArea, JTextField, …
- Contenedores secundarios: Jpanel, JScrollPane, JOptionPane, …
- Contenedores principales ( JFrame y JDialog) heredan de sus equivalentes en AWT
Swing vs AWT
- El funcionamiento general es igual (con una J delante) Árbol n-ario en cuya raíz hay un JFrame, en los nodos intermedios contenedores secundarios y en las hojas componentes primarios
- Se entrelazan ciertas clases. Por ejemplo, para construir ciertos diálogos es mejor no usar JDialog, sino:
- JOptionPane para establecer diálogos rápidos (“Yes/No”, “Yes/No/Cancel”, …)
- JFileChooser para seleccionar un fichero
- JColorChooser para escoger un color
- Los métodos de AWT son thread-safe, los de Swing en general no -> el event-dispatching thread debe ser el único thread válido para modificar los estados de las componentes gráficas una vez que están activas (es lo que ocurre por defecto)