Unidad III Interfaz de Escritorio SWING 1 INDICE • Introducción • Swing o awt? • 3.1.Biblioteca Swing • Componentes swing • Manejo de eventos • 3.2.Contenedores • Estructura de una aplicación • 3.3.Administrador de Diseño 2 Introducción • La meta original de diseño de la biblioteca de interfaz gráfico de usuario (GUI) en Java 1.0 era permitir al programador construir un GUI que tuviera buen aspecto en todas las plataformas. Esta meta no se logró. En su lugar, el AWT de Java 1.0 produce un GUI que tiene una apariencia igualmente mediocre en todos los sistemas. Además, es restrictivo: solo se pueden usar cuatro fuentes y no se puede acceder a ninguno de los elementos del GUI más sofisticados que existen en el sistema operativo. Ejemplo utilizando componentes AWT 3 Intro. (Cont.) • Además, el AWT de Java 1.0 no es orientado a objetos. ¿El por qué de esto? El AWT original había sido conceptualizado, diseñado e implementado en un mes. • La situación mejoró con el modelo de eventos del AWT de Java 1.1 que toma un enfoque orientado a objetos mucho más claro, junto con la adición de JavaBeans, un modelo de programación basado en componentes orientado hacia la creación sencilla de entornos de programación visuales. 4 Intro. (Cont.) • Java 2 acaba esta transformación alejándose del AWT de Java 1.0 esencialmente, reemplazando todo con las Java Foundation Classes (JFC), cuya parte GUI se denomina “Swing”. Se trata de un conjunto de JavaBeans fáciles de usar, y fáciles de entender que pueden ser arrastrados y depositados (además de programados a mano) para crear un GUI con el que un programador se encuentre finalmente satisfecho. 5 Ejemplo utilizando componentes de la biblioteca Swing 6 Intro. (Cont.) • Una interfaz gráfica con el usuario (GUI, graphical user interface) presenta una interfaz de imágenes con un programa. La interacción entre usuario y programa tiene lugar a través de la GUI. • Las GUI se construyen a partir de componentes de GUI. Un componente de GUI es un objeto visual con el que el usuario puede interactuar a través del ratón o el teclado. 7 ¿swing o awt? • La gran diferencia entre los componentes swing y los componentes awt es que los primeros están implementados absolutamente con código no nativo lo que los hace independientes de la plataforma. • Además proporcionan más capacidades que los componentes awt. • Los componentes swing se pueden identificar porque su nombre empieza por J; por ejemplo, el componente de awt Button tiene su correspondiente componente swing JButton. 8 ¿swing o awt? • Swing simplemente extiende el AWT añadiendo un conjunto de componentes, JComponents, y sus clases de soporte. • Hay un conjunto de componentes de Swing que son análogos a los de AWT, aunque Swing también proporciona cosas nuevas como árboles y pestañas. 9 ¿swing o awt? • Los componentes awt se localizan en el paquete java.awt y los componentes swing en el paquete javax.swing • Se debe evitar usar los componentes de AWT como Menu, ScrollPane y todos los componentes que heredan de las clases Canvas y Panel de AWT junto con los componentes Swing, porque estos se dibujarán sobre los componentes Swing. 10 3.1 Biblioteca Swing Que es swing? • Conjunto de Clases, interfaces, y recursos; para la construcción de gráficos. • Contiene 3 API: uno para 2D, otra para arrastrar - soltar y la última para facilitar el acceso. • Se construyo sobre la arquitectura AWT, la biblioteca de clases incorporada en Java 1.0 para la programación GUI. • La ventaja de Swing sobre AWT, es su independencia de la arquitectura; lo que hace que los gráficos se vean igual en cualquier plataforma. 11 Que provee swing? • Marcos: ventanas con barra de título, barra de menú, paneles, ventanas, menús, barras de menús, etc. • Contenedores. • Botones • Etiquetas • Campos de texto • Áreas de texto • Listas deplegables 12 Que provee swing? • La estructura básica del AWT se basa en Componentes y Contenedores. • Los contenedores contienen Componentes posicionados a su respecto y son Componentes a su vez, de forma que los eventos pueden tratarse tanto en Contenedores como en Componentes. 13 Que provee swing? El diseño de toda interfaz conlleva: Decidir la estructura de la interfaz: •Qué componentes gráficos se van a utilizar, y cómo se van a relacionar estos componentes. Decidir la disposición (layout) de los componentes: •Sirven para organizar los componentes contenidos en los mismos. Decidir el comportamiento de la interfaz: Gestión de eventos. •Algunos componentes son controles, que permiten reaccionar ante eventos del usuario. El comportamiento se especifica programando las respuestas a dichos eventos. 14 Componentes de un programa con swing • Un contenedor de nivel superior: puede se un marco(JFrame), un applet (JApplet) o bien un JDialog. Es la ventana principal. • Componentes de interfaz gráfica: botones, campos de texto, etc.; que se ubican en la ventana principal. • Contenedores diseñados para otros elementos de la interfaz: JPanel y JScrollPanel, son contenedores y al mismo tiempo son componentes. • Elementos para la gestión de eventos. 15 Jerarquía Swing Este diagrama muestra un subconjunto de los componentes SWING (en azul), y como se extienden (heredan) de los componentes AWT (en amarillo) 16 Jerarquía Swing Este diagrama muestra los paquetes y la extensión de algunos componentes SWING y AWT. 17 Jerarquía Swing Componentes y contenedores más usados. Componente Container Window JComponent Frame JFrame JPanel JButton JCheckBox JComboBox JLabel JList JRadioBox JTextBox JTextArea JTextField 18 Componentes swing Hay Componentes con entrada de tipo no textual como: •los botones de pulsación: JButton •las listas: JList •botones de marcación: JCheckbox •botones de selección: Choice, JComboBox •botones de comprobación: JCheckBoxGroup 19 Componentes swing Hay Componentes con entrada de tipo textual como: •campos de texto: JTextField •las áreas de texto: JTextArea •las etiquetas: JLabel Y otros Componentes como: • Barras de desplazamiento: JScrollbar • Zonas de dibujo: JCanvas 20 Componentes swing Incluso los Contenedores: • • • • Panel Window Dialog Frame También pueden considerarse como Componentes. 21 Componentes swing • Hay componentes swing para cada uno de los elementos que usted ya ha visto, mas de una vez, en una ventana de su sistema Windows, Linux u otro. • Los más comunes: – Etiquetas: Se implementa a partir de la clase JLabel. – Botones: Se implementa a partir de la clase JButton – Cajas de Texto: Se implementan a partir de la clase JTextField las de una sola línea de texto, y a partir de JTextArea las de varias líneas. 22 Componentes swing – Casillas de verificación: Se implementan a partir de la clase JCheckBox – Botones de opción: Se implementan a partir de la clase JRadioButton – Listas. Se implementan a partir de la clase JComboBox – Barras de desplazamiento: Se implementan a partir de la clase JScrollBar – Cuadros de diálogo estándar: Se implementan a partir de la clase JOptionPane 23 Componentes swing • Para usar con eficacia los componentes GUI, es necesario conocer la jerarquia swing, sobre todo las clases component y container. • Toda clase que hereda de la clase Component es un componente. • Cualquier clase que hereda de la clase Container es un contenedor. Un contenedor es un área en la que podemos colocar componentes. 24 Componentes swing Algunos métodos importantes de los componentes: • • • • void setSize( int width, int height ); // en pixeles void setBackground( Color c ); void setFont( Font f ); void setVisible( boolean isVisible ); 25 Rótulos • Un rótulo es un área en la que se exhibe una sola línea de texto estático (solo de lectura). • Los rótulos se crean con la clase JLabel que hereda directamente de la clase JComponent. • Hay dos constructores de JLabel: • public JLabel() Construye un rotulo vacío; no se exhibe texto. • public JLabel(String s) //texto de rótulo Construye un rótulo que exhibe el texto s. 26 Rótulos Métodos: • public String getText() Devuelve el texto del rótulo. • public void setText( String s) Fija el texto del rótulo. – Nota: Para que los rótulos y cualquier componente sean visibles es necesario agregarse a un contenedor con el método add (agregar). 27 Botones • Un botón es un componente en el que el usuario hace clic para disparar una acción específica. • Tipos de botones: Botones para pulsar, botones de opción y casillas de verificación. • Un botón para pulsar es un botón que dispara una acción cuando se hace clic en él con el ratón. 28 Botones • Los botones para pulsar se crean con la clase JButton • Los botones o casillas de verificación se crean con la clase JCheckBox • Los botones de opción se crean con la clase JRadioButton 29 Botones para pulsar Constructores de JButton: • public JButton( ) // boton sin rótulo Costruye un botón para pulsar no rotulado • public JButton (String s) ; Construye un botón para pulsar rotulado • El texto que aparece en un botón de pulsar es un rótulo de botón. • Una GUI puede tener muchos botones, pero los rótulos de cada botón deben ser únicos. 30 Eventos de los Botones • Cuando se hace clic en un botón se genera un evento de botón. En muchas situaciones se usa el rótulo del botón para determinar cual botón se pulsó. • Las GUI se controlan por eventos, es decir, responden a los eventos. • Un evento es una acción asíncrona; el usuario mueve el ratón, hace clic en el ratón, etc. • El sistema de manejo de ventanas envía los eventos a los programas java. 31 Eventos de los Botones • Los eventos se almacenan en objetos de la clase Event que hereda directamente de la clase object. • La clase Event forma parte del paquete java.swing. • Los rótulos (JLabel) y los paneles (JPanel) NO generan eventos. 32 Campos de Texto • Los campos de texto son áreas de una sola línea que reciben entradas tecleadas por el usuario. • El usuario teclea datos en el campo de texto y oprime la tecla Enter. El programa puede entonces usar los datos. • Los campos de texto también pueden servir para exhibir información. • Los campos de texto se crean con la clase JTextField que hereda directamente de la clase JComponent. 33 Campos de Texto • Constructores: public JTextField() Construye un objeto JTextField. • public JTextField (int columns ) //número de columnas Construye un objeto JTextField vacío con el número de columnas que se especifican. • public JTextField( String s ) //texto exhibido en el campo de texto Construye un objeto JTextField que exhibe s. • public JTextField ( String s, //texto exhibido en el campo de texto int columns ) //numero de columnas Construye un objeto JTextField que exhibe el número de columnas especificado. • 34 JComboBox • Generalmente se utiliza para elegir un objeto dentro de una lista de valores (generalmente String) • Solo se puede elegir una opción a la vez. • Si es editable se puede escribir dentro de el. 35 JComboBox Algunos métodos importantes: JComboBox( ); JComboBox( Object [ ] choices );//lista opciones void addItem( Object item ); //adicionar item Object getSelectedItem( );//obtener item selecc int getSelectedIndex( );//retorna indice de opción seleccionada. Por default la primera tiene índice 0 • void setEditable( boolean edit ); //si es editable • void setSelectedIndex( int index );//el que aparece elegido por default. • • • • • 36 JCheckBox y JRadioButton • Identifican un estado apagado/falso si no esta seleccionado y encendido/verdadero si esta seleccionado. • Se puede elegir una opción a la vez. • Algunos métodos: • JCheckBox( ); • JCheckBox( String theLabel ); texto del botón • JCheckBox( String theLabel, boolean state ); • boolean isSelected( ); //si esta seleccionado • void setLabel( String theLabel ); setear rotulo • void setSelected( boolean state ); por default 37 JList • Muestra un conjunto de items de texto, gráfico o ambos. • Permite tres tipos de selección: - Item único - Rango Simple - Rango Múltiple Ejemplo: private String [] contenidos = {“uno”, “dos”, ”tres”}; private JList lista = new JList(contenidos); 38 JPasswordField • Oculta los caracteres introducidos por el usuario. Algunos métodos: • setEchoChar('char') indica el carácter de máscara. • getPassword() recupera el password introducido. 39 Menu ● Los menús van dentro de la ventana principal de la aplicación. ● Es posible asignarles un gráfico (ícono). ● Pueden ser de tres tipos: • Drop-Down (JMenuBar) • Submenu (JMenu) • Contextuales (JPopupMenu) 40 Menu • Los menú “Drop-Down” son los que saldrán , por ejemplo, hacer click en Archivo. • Los submenus son aquellos que salen como un grupo de un elemento de menú. • Los menús contextuales, (clase JPopupMenu) son aplicables a la región en la que está localizado el puntero del ratón. • Son las clases JMenuBar, JMenu y JMenuItem. 41 3.2 Componentes Contenedores swing • Sirven para organizar a los demás componentes y a su vez pueden contener otros objetos del mismo tipo. – JPanel: simplemente un marco. – JFrame: una ventana independiente. – JDialog: una ventana dependiente, no se puede ver en la barra de tareas, ni posee los botones comunes de maximizar o minimizar, como en el JFrame. 42 Componentes Contenedores swing Algunos métodos importantes de los contenedores: • void setLayout( LayoutManager mgr ); • void add( Component comp ); • void add( Component comp, Object where ); JFrame JDialog 43 Componentes Contenedores swing • Clase JPanel: Es un contenedor que agrupa componentes dentro de una ventana. • Clase JTabbedPane: Es un contenedor que permite tener varios componentes separados por pestañas. 44 Componentes Contenedores swing Dialogos Son ventanas más limitadas que los Frames, y dependientes de estos, si se destruye el Frame, también lo hace el diálogo. ● Pueden ser: No modales: No impiden interactuar con el Frame. Modales: Impiden interactuar con el resto. ● Uno de los más importantes es: JOptionPane (Modal) 45 Modelo de delegación de eventos • El modelo de delegación es la manera en que Java gestiona la acción del usuario (evento) y la respuesta de la interfaz gráfica. Manejo de eventos • Cuando el usuario hace clic sobre un botón de pulsación espera que ocurra algo. Ese algo hay que programarlo y para poder hacerlo hay que saber como manejar ese evento. • El modelo se compone de 3 objetos: 46 Objetos Event, Source y Listener • El evento (Event) se produce en un determinado componente, por ejemplo un botón, una barra de desplazamiento, etc. • Ejemplo de evento: presionar el botón izquierdo del ratón, liberarlo, desplazar la barra hacia abajo, etc. • El componente dónde se produce el evento se denomina “fuente del evento” (Event source). • A continuación, el evento se transmite a otro componente ”manejador de eventos” (Event listener) que este asignado al componente en el que se produjo el evento. • El objeto que escucha los eventos (Event listener) es el que se encargará de responder a ellos adecuadamente. 47 Gestión del evento “ActionEvent” 48 Gestión del Evento “ActionEvent” • A la fuente del evento, en este caso un botón, le indicamos quién será su manejador de eventos, manejador que ha de extender la clase Adapter correspondiente o implementar la interfaz Listener (interfaz ActionListener en este caso). • Cuando el usuario genere el evento deseado (en este caso pulse el botón), el objeto fuente empaqueta información acerca del evento generando un objeto de tipo Event (ActionEvent en este caso) e invoca el método correspondiente del manejador (actionPerformed(actionEvent)) pasándole como información el objeto de tipo Event generado. • Es responsabilidad del manejador (listener), y no de la fuente, responder al evento, por ello se dice que la fuente delega la gestión del evento en el manejador. 49 Evento, interfaz y método de listener, posibles componente source 50 Evento, interfaz y método de listener, posibles componente source 51 Evento, interfaz y método de listener, posibles componente source 52 Evento, interfaz y método de listener, posibles componente source 53 Jerarquía de las clases de Eventos en Java java.lang java.util java.awt java.awt.event 54 Objeto Listener • Un objeto Listener es una instancia de una clase que implementa la interface listener que incluye métodos para ser llamados cuando un evento es lanzado. • Las interfaces son las siguientes: – – – – – – – – ActionListener AdjustmentListener KeyListener ComponentListener MouseListener MouseMotionListener ContainerListener TextListener 55 Ejemplo de Delegación de Eventos • Se crea un Panel como objeto Listener: Class Upanel extends JPanel implements ActionListener{ public void actionPerformed(ActionEvent e){ } } • Se utilizará un botón como objeto Source, que registrará el objeto listener y le enviará el objeto del tipo event. • Para registrar un objeto event listener con su respectivo event source la sintaxis usada es la siguiente: eventSourceObj.addEventListener(eventListenerObj); 56 Ejemplo de Delegación de Eventos • Ejemplo: Upanel panel1 = new Upanel(); JButton button1 = new JButton(“OK”); button1.addActionListener(panel1); • La instrucción Button1.addActionListener(panel1); registra el objeto actionlistener panel1 con el objeto event source button1. • Cuando el evento ocurre el event source envía objetos event a todos los listeners registrados. Así, cuando se presiona el botón “OK”, un objeto ActionEvent es creado y panel1.actionPerformed es llamado con el respectivo ActionEvent como parámetro. 57 Ejemplo de Delegación de Eventos Entonces el objeto Listener, usa la información en el objeto Event para responder al evento ocurrido. El objeto Upanel es pasado al método addActionListener() del botón addActionListener() Upanel implementando ActionListenerInterface en el método actionPerformed() Al presionar el botón, se llama al actionPerformed() del Listener 58 Interfaces, clases Adapter y sus métodos • Para cada interface que tiene más de un método, los creadores de Java crearon una clase llamada [nombre_evento]Adapter (MouseAdapter), una clase Adapter. • La clase Adapter implementa todos los métodos de la interface sin hacer nada en ellos. • Así, lo único que tendremos que hacer es que la clase Listener que escuche eventos extienda la clase Adapter y sobrescriba solo los métodos que nos interesen. 59 Interfaces, clases Adapter y sus métodos 60 Interfaces, clases Adapter y sus métodos 61 Estructura de una aplicación Gráfica • Una aplicación que muestra una interfaz gráfica cuando se ejecuta, no es más que un objeto de una clase derivada de JFrame. • El código mostrado a continuación puede ser una estructura válida para la mayoría de las aplicaciones que inician su ejecución visualizando una ventana principal. 62 Ejemplo de una aplicación import javax.swing.*; import java.awt.*; import java.awt.event.*; public class AplicacionSwing extends JFrame { // referencias a los componentes // otras referencias private AplicacionSwing( String titulo ) { super(titulo); iniciarComponentes(); //ajustar el tamaño de la ventana al minimo pack(); } 63 private void iniciarComponentes() { //permitir que la ventana de la aplicación //responda a los eventos de ventana addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent evento) { cerrarVentana(); } }); // fin de addWindowListener } 64 private void cerrarVentana() { //salir de la aplicación System.exit(0); } public static void main(String [] args) { AplicaciónSwing vPpal = new AplicacionSwing(“Aplicación Swing”); vPpal.show(); } } //de la aplicación 65 Creación de interfaces usando el IDE Netbeans • En la programación de aplicaciones Java, los IDE facilitan mucho al colocar una paleta de opciones para dibujar los componentes y su distribución. • El código generado por el IDE cumple normalmente las reglas que se han visto para la creación de eventos, listeners y clases. • Se creará una interfaz usando Netbeans. 66 • Como se ve en la imagen siguiente, después de crear un proyecto nuevo, adicione un Formulario JFrame al paquete principal usando el menú de contexto, llame a la clase JFrameAlumno 67 • El resultado es un área de trabajo, una paleta de componentes, y un cuadro de propiedades. Así: Paleta Area de trabajo Propiedades • El resultado es un área de trabajo, una paleta de componentes, y un cuadro de propiedades. Así: 68 • Ahora se puede iniciar colocando los componentes para dibujar su formulario, arrastrando un componente de la paleta sobre el área de trabajo; luego de esto se puede adicionar las acciones para los eventos respectivos. • Al hacer clic derecho sobre el área de trabajo, se puede seleccionar el Layout o disposición que utilizará este contenedor. 69 • Como se puede ver en la figura anterior, Netbeans posee un Layout propio que permite colocar los componentes en una posición absoluta y además posee los Layout estándar. • Note que al seleccionar un componente, sus propiedades se muestran y se pueden definir los valores que se quiere que tengan. 70 • Con clic derecho sobre el componente, también se puede acceder a los métodos que implementan el respectivo Listener del evento seleccionado. 71 • Netbeans entonces pasa a la ventana origen y muestra el código generado por esa acción, el cual es el cascarón del método que se encargará de manejar el evento del jToggleButton. 72 • El método initComponents() es generado por Netbeans y no puede ser modificado, porque lo maneja automaticamente el IDE desde el editor Visual. • Lo que sí podemos modificar es el método jToggleButtonActionPerformed que es donde se coloca la respuesta al evento generado. • El JFrame posee un método main y crea una instancia de la clase para ejecutarse. El frame toma un valor y trae en método setVisible, que hace posible observarlo cuando se corre el programa. 73 3.3 Administrador de diseño • TIPOS DE DISPOSICION: • Existen 5 tipos básicos de Layouts: – – – – – FlowLayout GridLayout GridBagLayout BorderLayout CardLayout • Para utilizar un Layout, se debe establecer en el contenedor con el método: – void setLayout(LayoutManager mgr); – Nota: veremos en detalle borderlayout y gridlayout 74 Tipos de disposición (Layout) 75 Border Layout • Coloca los componentes en los cuatro puntos cardinales, o en el centro. El espacio del centro siempre obtiene el mayor tamaño. • Valores : BorderLayout.NORTH (superior) BorderLayout.SOUTH (inferior) BorderLayout.EAST(derecho) BorderLayout.WEST (izquierdo) BorderLayout.CENTER (rellenar el centro hasta los bordes de todos los demás componentes. 76 Grid Layout • Crea una rejilla de celdas iguales que se rellena de izquierda a derecha, línea a línea. La rejilla la crea con el número de columnas o filas que se le indique. • Constructores. public GridLayout (int rows, int columns) Construye un GridLayout con rows filas y columns columnas. public GridLayout (int rows, int columns, int h, int v) Construye un GridLayout con cada componente separado horizontalmente por h pixeles y verticalmente por v pixeles. 77 Código equivalente generado por Netbeans para el primer ejemplo /* * AplicacionSwing.java * * */ package aplicacionswing; public class AplicacionSwing extends javax.swing.JFrame { /** Creates new form AplicacionSwing */ public AplicacionSwing() { initComponents(); } 78 /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. * The content of this method is * always regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc=" Código Generado "> private void initComponents() { setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { formWindowClosing(evt); } }); 79 javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING). addGap(0, 400, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING). addGap(0, 300, Short.MAX_VALUE) ); pack(); 80 }// </editor-fold> private void formWindowClosing(java.awt.event.WindowEvent evt) { // TODO: Agrege su codigo aqui: cerrarVentana(); } private void cerrarVentana() { System.exit(0); } 81 /** * @param args the command line arguments */ public static void main(String args[ ]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new AplicacionSwing().setVisible(true); } }); } // Declaración de variables -no modificar // Fin de declaración de variables } 82 Ejemplo mostrando el uso de JPopupMenu // Demonstrating JPopupMenus import java.awt.*; import java.awt.event.*; import javax.swing.*; public class PopupTest extends JFrame { private JRadioButtonMenuItem items[]; private final Color colorValues[] = { Color.BLUE, Color.YELLOW, Color.RED }; private JPopupMenu popupMenu; // set up GUI public PopupTest() { super( "Using JPopupMenus" ); 83 ItemHandler handler = new ItemHandler(); String colors[] = { "Blue", "Yellow", "Red" }; // set up popup menu and its items ButtonGroup colorGroup = new ButtonGroup(); popupMenu = new JPopupMenu(); items = new JRadioButtonMenuItem[ 3 ]; // construct each menu item and add to popup menu; // also enable event handling for each menu item for ( int count = 0; count < items.length; count++ ) { items[ count ] = new JRadioButtonMenuItem( colors[ count ] ); popupMenu.add( items[ count ] ); colorGroup.add( items[ count ] ); items[ count ].addActionListener( handler ); } 84 getContentPane().setBackground( Color.WHITE ); // declare a MouseListener for the window that //displays a JPopupMenu when the popup trigger //event occurs addMouseListener( new MouseAdapter() { // anonymous inner class // handle mouse press event public void mousePressed( MouseEvent event ) { checkForTriggerEvent( event ); } // handle mouse release event public void mouseReleased( MouseEvent event ) { checkForTriggerEvent( event ); } 85 // determine whether event should trigger popup menu private void checkForTriggerEvent( MouseEvent event ) { if ( event.isPopupTrigger() ) popupMenu.show( event.getComponent(), event.getX(), event.getY() ); } } // end anonymous inner clas ); // end call to addMouseListener setSize( 300, 200 ); setVisible( true ); } // end constructor PopupTest 86 public static void main( String args[] ) { PopupTest application = new PopupTest(); application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } // private inner class to handle menu item events private class ItemHandler implements ActionListener { // process menu item selections public void actionPerformed( ActionEvent event ) { // determine which menu item was selected for ( int i = 0; i < items.length; i++ ) if ( event.getSource() == items[ i ] ) { getContentPane().setBackground( colorValues[ i ] ); return; } } } // end private inner class ItemHandler 87