Sei sulla pagina 1di 31

OBJETIVOS Crear aplicaciones con ventanas internas utilizando la clase JInternalFrame y JOptionPane Comprender y utilizar las reglas de Frames

es internos.

1. Clase JInternalFrame Con esta clase podemos mostrar ventanas dentro de otras ventanas. Esto es tpico de determinados programas, como por ejemplo, el procesador de textos de la empresa MicroSoft: Excel. En este programa se permite al usuario tener abiertos varios documentos a la vez, de manera que cada uno de ellos aparecer en una ventana distinta, y dentro de la ventana principal del programa. Las ventanas internas tienen una determinadas caractersticas propias que las hacen diferentes a las ventanas instanciadas a partir de la clase JFrame:

90

Un frame interno debe aadirse a un contenedor, normalmente un JDesktopPane (que es una subclase de LayeredPane o panel por capas). De no hacerlo, la ventana interna no aparecer.

Debemos seleccionar el tamao de un frame interno, ya que si no realizamos esta operacin, la ventana interna tendr tamao 0, por lo que no aparecer.

Es conveniente seleccionar la posicin del frame interno, ya que sino su localizacin comenzar en la posicin (0,0) de su contenedor. Para mostrar una ventana interna no ser necesario llamar al mtodo show() o setVisible() ya que los frames internos se muestran automticamente cuando se aaden a un contenedor.

Las ventanas internas no provocan eventos de ventana, sino eventos internal frame.

Ejemplo:

91

Los mtodos principales usados con ventanas internas son los siguientes: MTODOS CONSTRUCTORES Descripcin Crea un internal frame o ventana interna. Crea un internal frame con el ttulo indicado. Crea un internal frame con el ttulo indicado. El argumento boolean, se refiere a si se permite al usuario que redimensione la ventana (el valor por defecto es false). Es idntico al caso anterior, con la salvedad de que aparece un tercer argumento boolean que se refiere a si se permite al usuario que cierre la ventana (el valor por defecto es false). Es idntico al caso anterior, con la salvedad de que aparece un cuarto argumento boolean que se refiere a si se permite al usuario que maximice la ventana (el valor por defecto es false). Es idntico al caso anterior, con la salvedad de que aparece un quinto argumento boolean que se refiere a si se permite al usuario que minimice la ventana (el valor por defecto es false).

Mtodo JInternalFrame() JInternalFrame(String) JInternalFrame(String, boolean)

JInternalFrame(String, boolean, boolean)

JInternalFrame(String, boolean, boolean, boolean) JInternalFrame(String, boolean, boolean, boolean, boolean)

MTODOS NO CONSTRUCTORES
Mtodo void setLocation(Point) void setLocation(int,int) void setSize(Dimension) void setSize(int,int) void setBounds(Rectangle) void setBounds(int,int,int,int) void pack() void moveToFront() void moveToBack() Descripcin Establece la posicin del frame interno. Establece el tamao del frame interno. Establece el tamao y la posicin del frame interno. Empaqueta el frame interno. Si el frame interno est contenido en un LayeredPane, a travs de estos mtodos, podremos mover el frame interno, adelante y atrs, respectivamente. Establece y obtiene, respectivamente, lo que ocurre cuando se intenta cerrar el frame interno. Los posibles valores son HIDE_ON_CLOSE (por defecto), DO_NOTHING_ON_CLOSE, DISPOSE_ON_CLOSE. Estable y obtiene, respectivamente, si el frame interno est cerrado actualmente. Establece y obtiene, respectivamente, si el frame interno est minimizado actualmente.

void setDefaultCloseOperation(int) int getDefaultCloseOperation() void setClosed(boolean) boolean isClosed() void setIcon(boolean) boolean isIcon()

92

void setMaximum(boolean) boolean isMaximum() void setSelected(boolean) boolean isSelected() void setFrameIcon(Icon) Icon getFrameIcon() void setResizable(boolean) boolean isResizable() void setClosable(boolean) boolean isClosable() void setIconifiable(boolean) boolean isIconifiable() void setMaximizable(boolean) boolean isMaximizable()

Establece y obtiene, respectivamente, si el frame interno esta maximizado actualmente. Establece y obtiene, respectivamente, si el frame interno est seleccionado actualmente. Estable y obtiene, respectivamente, el icono mostrado en el ttulo del frame interno. Establece y obtiene, respectivamente, si el usuario puede redimensionar el frame interno. Establece y obtiene, respectivamente, si el usuario puede cerrar el frame interno. Establece y obtiene, respectivamente, si el usuario puede minimizar el frame interno. Establece y obtiene, respectivamente, si el usuario puede maximizar el frame interno.

Manejo de eventos
JInternalFrame, tiene su propia clase de escucha que recibe el nombre de InternalFrameListener; de manera que los eventos internal frame son a los JInternalFrame, lo que los eventos window son a los JFrame o Frame. Los eventos internal frame, al igual que los window, permiten a sus oyentes saber cundo la ventana o frame se ha mostrado por primera vez, cundo se ha eliminado, iconificado, agrandado, activado o desactivado. La interface InternalFrameListener tiene varios mtodos, lo que propicia el que tenga una clase adaptadora, InternalFrameAdapter. Estos mtodos son los siguientes:

93

Mtodo void internalFrameOpened(InternalFrameEvent) void internalFrameClosing(InternalFrameEvent)

void internalFrameClosed(InternalFrameEvent) void internalFrameIconified(InternalFrameEvent) void internalFrameDeiconified(InternalFrameEvent)

Descripcin es llamado justo despus de que el frame interno se muestre por primera vez se llama despus de que el usuario pida cerrar el frame interno. Por defecto JInternalFrame oculta la ventana cuando el usuario la cierra. Para cambiar esta ltima accin se puede utilizar el mtodo setDefaultCloseOperation de JinternalFrame, que podr recibir como parmetros las constantes definidas en WindowConstants DISPOSE_ON_CLOSE y DO_NOTHING_ON_CLOSE llamado por el AWT justo despus de que se haya ocultado el frame interno escuchado llamado inmediatamente despus de que el frame interno escuchado sea iconificado llamado inmediatamente despus de que el frame interno escuchado sea desiconificado

94

void internalFrameActivated(InternalFrameEvent) void internalFrameDeactivated(InternalFrameEvent)

se llama justo despus de que el frame interno escuchado sea activado se llama justo despus de que el frame interno escuchado sea desactivado

ACTIVIDAD
Crear un frame con otro interno en ql que se pueda crear todas las ventanas internas que se desea.

import java.awt.BorderLayout; import java.awt.event.*; import javax.swing.*; class FrameInternalFrames extends JFrame implements ActionListener { static int wF, hF; JButton boton = new JButton("Crea Internal Frame"); PanelInternalFrames panel = new PanelInternalFrames(); public FrameInternalFrames(String s) { super(s); boton.addActionListener(this); add(boton, BorderLayout.NORTH); add(panel, BorderLayout.CENTER); wF = getToolkit().getScreenSize().width; hF = getToolkit().getScreenSize().height; setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(500, 400); setLocation((wF - getSize().width) / 2, (hF - getSize().height) / 2); setVisible(true); }

public void actionPerformed(ActionEvent arg0) { if (arg0.getSource() == boton) panel.creaInternalFrame();

95

} } Clase Panel

class PanelInternalFrames extends JPanel { JDesktopPane desktop = new JDesktopPane(); int contador = 1; int pos = 0; public PanelInternalFrames() { try {

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { e.printStackTrace(); } setLayout(new BorderLayout()); desktop.setBackground(new Color(200,200, 200)); desktop.setPreferredSize(new Dimension(600, 400)); for (int i = 0; i < 3; i++) { creaInternalFrame(); } // ---- agregamos el desktop dentro de un scrollpane add(new JScrollPane(desktop), BorderLayout.CENTER); } public void creaInternalFrame() { JInternalFrame f = new JInternalFrame("InternalFrame" + contador++, // title true, // que cambie de tamao true, // que permita cerrarse true, // maximizable true); // minimizable f.setLocation(pos * 50 + 10, pos * 50 + 10); desktop.setPreferredSize(new Dimension(600+(pos * 50), 400+(pos * 50))); f.setSize(200, 150); f.setBackground(new Color(200, 255, 255)); desktop.add(f); 96

f.setVisible(true); pos++; } }

import javax.swing.*; public class PrincipalInternalFrames { static public void main(String[] arg) { JFrame f = new FrameInternalFrames( "JInternalFrame - Ejercicio 1"); } }

Clase JOptionPane
2. Cmo crear Dilogos? Muchas clases Swing soportan dilogos -- ventanas que son ms limitadas que los frames. Para crear un dilogo, simple y estndard se utiliza JOptionPane. Para crear dilogos personalizados, se utiliza directamente la clase JDialog. La clase ProgressMonitor puede poner un dilogo que muestra el progreso de una operacin. Otras dos clases, JColorChooser y JFileChooser, tambin suministran dilogos estndard. Para mostrar un dilogo de impresin se utiliza el mtodo getPrintJob de la clase Toolkit. La clase JDialog es una subclase de la clase java.awt.Dialog del AWT. Le aade a Dialog un root pane y soporte para una operacin de cerrado por defecto. Estas son las mismas caractersticas que tiene JFrame, y utilizar directamente JDialog es muy similar a hacerlo con JFrame. Puedes ver Cmo crear Frames para ms informacin sobre cmo aadir componentes a una ventana y cmo implementar algn oyente de window. Incluso si utilizamos JOptionPane para implementar un dilogo, estamos utilizando JDialog detrs de la escena. La razn para esto es que JOptionPane es simplemente un contenedor que puede crear automticamente un JDialog y se aade a s mismo al panel de contenido de JDialog.

97

3. Caractersticas de JOptionPane
Utilizando JOptionPane, se pueden crear muchos dilogos. Aqu podemos ver unos ejemplos, todos producidos por DialogDemo. Como podramos observar en los ejemplos anteriores, JOptionPane proporciona soporte para mostrar dilogos estndards, proporcionando iconos, especificando el ttulo y el texto del dilogo, y personalizando el texto del botn. Otras caractersticas permiten personalizar los componentes del dilogo a mostrar y especificar si el dilogo debera aparecer en la pantalla. Incluso se puede especificar qu panel de opciones se pone a s mismo dentro de un frame interno (JInternalFrame) en lugar de un JDialog. Cuando se crea un JOptionPane, el cdigo especfico del aspecto y comportamiento aade componentes al JOptionPane y determina la distribucin de dichos componentes. La siguiente figura muestra cmo los aspectos y comportamientos ms comunes distribuyen un JOptionPane. Mostrar dilogos modales estndard (utiizando mtodos de la clase JOptionPane) Mtodo int showMessageDialog(Component, Object) int showMessageDialog(Component, Object, String, int) int showMessageDialog(Component, Object, String, int, Icon) int showOptionDialog(Component, Object, String, int, int, Icon, Object[], Object) int showConfirmDialog(Component, Object) int showConfirmDialog(Component, Object, String, int) int showConfirmDialog(Component, Object, String, int, int) int showConfirmDialog(Component, Object, String, int, int, Icon) String showInputDialog(Object) String showInputDialog(Component, Object) String showInputDialog(Component, Object, Muestra un dilogo de entrada. Muestra un dilogo. Muestra un dilogo modal con un botn. Propsito

Muestra un dilogo modal que [PENDIENTE: elaborar].

98

String, int) String showInputDialog(Component, Object, String, int, Icon, Object[], Object) int showInternalMessageDialog(...) int showInternalOptionDialog(...) int showInternalConfirmDialog(...) String showInternalInputDialog(...) Mtodos para utilizar JOptionPane directamente Mtodo JOptionPane() JOptionPane(Object) JOptionPane(Object, int) JOptionPane(Object, int, int) JOptionPane(Object, int, int, Icon) JOptionPane(Object, int, int, Icon, Object[]) JOptionPane(Object, int, int, Icon, Object[], Object) Frame getFrameForComponent(Component) JDesktopPane getDesktopPaneForComponent(Component) Manejan mtodos de clase de JOptionPane que encuentran el frame o desktop pane, respectivamente, en el que se encuentra el componente especificado. Crea un ejemplar de JOptionPane. Propsito Implementa un dilogo estndard como un frame interno.

Otros Constructores y Mtodos de JOptionPane Mtodos JOptionPane()


JOptionPane(Object) JOptionPane(Object, int)

Propsito

Crea un ejemplar de JOptionPane.

99

JOptionPane(Object, int, int) JOptionPane(Object, int, int, Icon) JOptionPane(Object, int, int, Icon, Object[]) JOptionPane(Object, int, int, Icon, Object[], Object)

Constructores y Mtodos ms utilizados de JDialog Mtodo JDialog()


JDialog(Frame) JDialog(Frame, boolean) JDialog(Frame, String) JDialog(Frame, String, boolean)

Propsito Crea un ejemplar de JDialog. El argumento Frame, si existe, es el frame (normalmente un objeto JFrame) del que depende el dilogo. Se hace el argumento booleano true para especificar un dilogo modal, false o ausente, para especificar un dilogo no modal. Tambin se puede especificar el ttulo de un dilogo utilizando un argumento string. Obtiene y selecciona el panel de contenido que normalmente es el contenedor de todos los componentes del dilogo. Obtiene y selecciona lo que sucece cuando el usuario intenta cerrar el dilogo. Valores posibles: DISPOSE_ON_CLOSE, DO_NOTHING_ON_CLOSE, HIDE_ON_CLOSE (por defecto).

Container getContentPane()
setContentPane(Container)

int getDefaultCloseOperation()
setDefaultCloseOperation(int)

void Centra el dilogo sobre el componente setLocationRelativeTo(Component) especificado. Ejemplos

100

import javax.swing.JOptionPane; public class option { public static void main(String[] args) { String ans; ans = JOptionPane.showInputDialog(null, "Velocidad en millas por hora?"); double mph = Double.parseDouble(ans); double kph = 1.621 * mph; JOptionPane.showMessageDialog(null, "Kilometros por hora = " + kph); System.exit(0); } }

ACTIVIDAD
Crear la siguiente ventana en el cual se puede elegir diferentes ventanas de dialogo.

101

102

OBJETIVOS Construir aplicaciones que utilicen mens para las opciones. Incluir eventos y acciones en las opciones del men.

JMen
1. Concepto: Un men proporciona una forma de ahorrar espacio y permitir al usuario elegir una entre varias opciones. Otros componentes con los que el usuario puede hacer una eleccin incluyen combo boxes, lists, radio buttons, y tool bars. Los mens son nicos en que, por convencin, no se sitan con los otros componentes en el UI. En su lugar, aparecen en una barra de men o en un men desplegable. Una barra de men contiene uno o ms mens, y tiene una posicin dependiente de la plataforma normalmente debajo de la parte superior de la ventana. Ejemplo de jerarqua de clases de la clase JMen

103

2. Estructura de un Men JMenuBar

JMenu1 JMenuItem1

3. El API de JMenu

Las siguientes tablas listan los mtodos y constructores ms utilizados de Jmenu. El API se divide en estas categoras. Crear y Configurar Barras de Men Mtodo JMenuBar() void setJMenuBar(JMenuBar) Propsito Crea una barra de men. Selecciona u obtiene la barra de men de un applet, dialog, frame, o root pane. En las

104

JMenuBar getJMenuBar() (en JApplet, JDialog, JFrame, JRootPane) void setMenuBar(JMenuBar) JMenuBar getMenuBar() (en JInternalFrame) Crear y Rellenar Mens Mtodo JMenu() JMenuItem add(JMenuItem) JMenuItem add(Action) void add(String) void addSeparator() JMenuItem insert(JMenuItem, int)

siguientes versiones de Swing y del JDK 1.2, los frames internos tambin soportarn estos mtodos.

Selecciona u obtiene la barra de men de un Frame interno. En las siguientes versiones de Swing y del JDK 1.2, este mtodo ser anulado y deberamos utilizar setJMenuBar/getJMenuBar.

Propsito Crea un men. Aade un tem de men al final del men. Si el argumento es un objeto Action, el men crea un tem de men como se describe en Cmo usar Actions. Si el argumento es un string, el men crea automticamente un objeto JMenuItem que muestra el texto especificado. Aade un separador la final del men.

Inserta un tem de men o un separador en un men, en la posicin especificada. El primer tem de men es la posicin 0, el segundo la posicin 1, etc. Los argumentos JMenuItem, Action, y String se tratan de void insert(String, int) la misma forma que en los correspondientes mtodos add. void insertSeparator(int) JMenuItem insert(Action, int) void remove(JMenuItem) void remove(int) void removeAll() Crear y Rellenar Mens Desplegables Mtodo JPopupMenu() 105 Propsito Crea un men desplegable. El Elimina el tem o tems especificados del men. Si el argumento es un entero, especifica la posicin del tem a eliminar.

JPopupMenu(String)

argumento string opcional especifica el ttulo que el aspecto y comportamiento podra mostrar como parte de la ventana desplegable. Aade un tem de men al final del men desplegable. Si el argumento es un objeto Action. Aade un separador al final del men desplegable. Inserta un tem de men en la posicin especificada. El primer tem del men est en la posicin 0, el segundo en la posicin 1, etc. El argumento Component especfica el tem de men a aadir. El argumento Action es tratado de la misma forma que en el mtodo add correspondiente. Elimina el tem o tems especificados del men. Si el argumento es un entero, especifica la posicin del elemento del men a eliminar. Por defecto, Swing implementa una ventana de men utilizando un componente de peso ligero. Para evitar estos problemas, se puede llamar a JPopupMenu. setDefaultLightWeightPopupEnabl ed(false) . Muestra el men desplegable en la posicin X,Y (especificada en el orden de los argumentos enteros) en el sistema de coordenadas del componente especificado.

JMenuItem add(JMenuItem) JMenuItem add(Action) void addSeparator()

void insert(Component, int) JMenuItem insert(Action, int)

void remove(JMenuItem) void remove(int) void removeAll()

static void setDefaultLightWeightPopupEnabled( boolean)

void show(Component, int, int)

Implementar tems de Men Mtodo JMenuItem() Propsito Crea un tem de men normal. El argumento icon, si existe, especifica el icono que debera mostrar el tem de

106

JMenuItem(Icon) JMenuItem(String) JMenuItem(String, Icon) JMenuItem(String, int) JCheckBoxMenuItem() JCheckBoxMenuItem(Icon) JCheckBoxMenuItem(String) JCheckBoxMenuItem(String, Icon) JCheckBoxMenuItem(String, boolean) JCheckBoxMenuItem(String, Icon, boolean) JRadioButtonMenuItem()
JRadioButtonMenuItem(Icon) JRadioButtonMenuItem(String) JRadioButtonMenuItem(String, Icon)

men. Igualmente el argumento String, especifica el texto que debera mostrar el tem de men. El argumento entero especifica el mnemnico de teclado a utilizar.

Crea un tem de men que se parece y acta como un checkbox. Si se especifica un icono, el tem de men utiliza el icono en vez del icono por defecto de los checkboxes.. De lo contario el ten de men est desactivado.

Crea un tem de men que se parece y acta como un radio buttom. Si se especifica un icono, el tem de men utiliza el icono en vez del icono por defecto de los botones de radio. El argumento string, si existe, especifica el texto que debera mostrar el tem de men. El tem de men est inicialmente desactivado. Seleciona u obtiene el estado de seleccin de un tem de men. Si el argumento es true, activa el tem de men, si es false lo desactiva. Selecciona la tecla alternativa para seleccionar el tem de men sin el ratn. Seleciona el nombre de la accin realizada por el tem de men.

void setState(boolean)
boolean getState()

void setEnabled(boolean) void setMnemonic(char) void setActionCommand(String)

void addActionListener(ActionListener) Aade un oyente de eventos al tem de men. void addItemListener(ItemListener) 4. Construir un men

107

Para construir una barra de men tenemos estos componentes. JMenuBar. Es la barra de men principal. Una barra horizontal alargada en la que se colocarn las distintas opciones. Si miras en tu navegador, arriba, vers una barra de estas con opciones como "Archivo", "Editar", etc. JMenu. Es una de las cosas que se pueden aadir a un JMenuBar o a otro JMenu. Cuando aadimos uno de estos, tendremos un algo que al pinchar despliega un nuevo men. Si en tu navegador, arriba donde pone "Archivo" pinchas con el ratn, vers que se despliega un men con ms opciones como "Abrir", "Guardar como", etc. JMenuItem. Por fin, este es el currito. Es el que cuando lo pinchas hace algo til, como "guardar como", "abrir", etc. JSeparator. Este slo sirve para poner una rayita y separar varios JMenuItem. Por ejemplo, dentro de "Editar", las opciones "Copiar", "Cortar" y "Pegar" suelen estar separadas con rayitas de otras opciones en el mismo men. Estos son los JSeparator.

5. Poner acciones en los JMenuItem Para que un JMenuItem haga algo, al crearlo hay que pasarle una clase que implemente la interface Action. Esta clase debe tener un mtodo actionPerformed() que es el que se ejecutar cuando se d clic con el mouse en esa opcin de men.
public class MiAccionDeMenu implements Action { ... public void actionPerformed (ActionEvent e) { // Aqu lo que queremos que haga esa opcin de men. } } ... MiAccionDeMenu miAccion = new MiAccionDeMenu(); JMenuItem menuItem = new JMenuItem(miAccion);

El problemilla con esto es que Action requiere que implementemos ms mtodos un poco engorrosos. Suele ser normal heredar de AbstractAction en vez de implementar todos los mtodos de Action. Heredando de AbstractAction slo tenemos que implementar el mtodo actionPerformed().

108

public class MiAccionDeMenu extends AbstractAction { public void actionPerformed (ActionEvent e) { // Aqu lo que queremos que haga esa opcin de men. } } ... MiAccionDeMenu miAccion = new MiAccionDeMenu(); JMenuItem menuItem = new JMenuItem(miAccion);

6. Colocar controles en el Men Para poner la etiqueta al JMenuItem, o ponerle un icono o una tecla de acceso rpido (estilo Ctrl-C para "Copiar", Ctrl-V para "Pegar", etc), se hace con la Action que metemos en el JMenuItem. El cdigo puede ser as accionCopiar.putValue(Action.NAME, accionCopiar.putValue( Action.ACCELERATOR_KEY, KeyStroke.getAWTKeyStroke('C', Event.CTRL_MASK)); "Copiar");

Todo se hace con el mtodo putValue(). Este admite dos parmetros. Uno es el nombre de lo que queremos cambiar o poner (Action.NAME para la etiqueta visible en el JMenuItem, Action.ACCELERATOR_KEY para la tecla de acceso rpido, Action.SMALL_ICON para una imgen, etc). En el cdigo hemos puesto "Copiar" como texto visible y Ctrl-C como tecla aceleradora. Lo del KeyStroke es la forma de decir Ctrl-C y no nos vamos a meter en ello. Simplemente es el caracter que queremos 'C' con Ctrl (lo de CTRL_MASK).

109

7. Construimos la barra de men completa. Si suponemos que ya tenemos hechas nuestras acciones y las hemos llamado accionSalvar, accionCargar, accionSalir, accionCopiar, etc, etc, el cdigo que construye la barra de men puede ser como este: Una barra de men JMenuBar con dos JMenu: "Archivo" y "Editar" JMenuBar barraMenu = new JMenuBar(); JMenu menuArchivo = new JMenu("Archivo"); JMenu menuEditar = new JMenu("Editar"); barraMenu.add(menuArchivo); barraMenu.add(menuEditar); Para contruir el contenido del menuEditar, el cdigo puede ser como este JMenuItem copiar = new JMenuItem(accionCopiar); JMenuItem cortar = new JMenuItem(accionCortar); JMenuItem pegar = new JMenuItem(accionPegar); JMenuItem buscar = new JMenuItem(accionBuscar); menuEditar.add(copiar); menuEditar.add(cortar); menuEditar.add(pegar); menuEditar.add(new JSeparator()); // Una raya separadora. menuEditar.add(buscar);

ACTIVIDAD
Cree el siguiente men para su aplicacin principal

110

111

public class PruebaMenu extends JFrame { private final Color valoresColor[]={Color.black,Color.blue,Color.red,Color.green }; private JRadioButtonMenuItem elementosColor[], tiposLetra[]; private JCheckBoxMenuItem elementosEstilo[]; private JLabel pantallaEtiqueta; private ButtonGroup grupoTiposLetra, grupoColores; private int estilo; // configurar GUI public PruebaMenu() { super( "Ejemplo de Menus en Java" ); // establecer men Archivo y sus elementos de men JMenu menuArchivo = new JMenu( "Archivo" ); menuArchivo.setMnemonic( 'A' ); // establecer elemento de men Acerca de... JMenuItem elementoAcerca = new JMenuItem( "Informacion acerca de..." ); elementoAcerca.setMnemonic( 'c' ); menuArchivo.add( elementoAcerca ); elementoAcerca.addActionListener( new ActionListener() { // clase interna annima // mostrar cuadro de dilogo de mensaje cuando el usuario seleccione Acerca de... public void actionPerformed( ActionEvent evento ) { JOptionPane.showMessageDialog( PruebaMenu.this, "ste es un ejemplo\ndel uso de mens", "Acerca de", JOptionPane.PLAIN_MESSAGE ); } } // fin de la clase interna annima ); // fin de la llamada a addActionListener // establecer elemento de men Salir JMenuItem elementoSalir = new JMenuItem( "Salir" ); elementoSalir.setMnemonic( 'S' ); menuArchivo.add( elementoSalir ); elementoSalir.addActionListener( new ActionListener() { // clase interna annima 112

// terminar la aplicacin cuando el usuario haga clic en elementoSalir public void actionPerformed( ActionEvent evento ) { System.exit( 0 ); } } // fin de la clase interna annima ); // fin de la llamada a addActionListener // crear barra de mens y adjuntarla a la ventana PruebaMenu JMenuBar barra = new JMenuBar(); setJMenuBar( barra ); barra.add( menuArchivo ); // crear men Formato, con sus submens y elementos de men JMenu menuFormato = new JMenu( "Formato" ); menuFormato.setMnemonic( 'F' ); // crear submen Color String colores[] = { "Negro", "Azul", "Rojo", "Verde" }; JMenu menuColor = new JMenu( "Color" ); menuColor.setMnemonic( 'C' ); elementosColor = new JRadioButtonMenuItem[ colores.length ]; grupoColores = new ButtonGroup(); ManejadorEventos manejadorEventos = new ManejadorEventos(); // crear elementos de men tipo botones de opcin para el men Color for ( int cuenta = 0; cuenta < colores.length; cuenta++ ) { elementosColor[ cuenta ] = new JRadioButtonMenuItem( colores[ cuenta ] ); menuColor.add( elementosColor[ cuenta ] ); grupoColores.add( elementosColor[ cuenta ] ); elementosColor[ cuenta ].addActionListener( manejadorEventos ); } // seleccionar primer elemento del men Color elementosColor[ 0 ].setSelected( true ); // agregar el men Formato a la barra de mens menuFormato.add( menuColor ); menuFormato.addSeparator(); // crear submen Tipo de letra String nombresTiposLetra[] = { "Serif", "Algerian", "SansSerif" };

113

JMenu menuTiposLetra = new JMenu( "Tipo de letra" ); menuTiposLetra.setMnemonic( 'T' ); tiposLetra = new JRadioButtonMenuItem[ nombresTiposLetra.length ]; grupoTiposLetra = new ButtonGroup(); // crear elementos de men tipo botones de opcin para el men Tipos de letra for ( int cuenta = 0; cuenta < tiposLetra.length; cuenta++ ) { tiposLetra[ cuenta ] = new JRadioButtonMenuItem( nombresTiposLetra[ cuenta ] ); menuTiposLetra.add( tiposLetra[ cuenta ] ); grupoTiposLetra.add( tiposLetra[ cuenta ] ); tiposLetra[ cuenta ].addActionListener( manejadorEventos ); } // seleccionar el primer elemento del men Tipo de letra tiposLetra[ 0 ].setSelected( true ); menuTiposLetra.addSeparator(); // establecer elementos del men Estilo String nombresEstilo[] = { "Negrita", "Cursiva" }; elementosEstilo = new JCheckBoxMenuItem[ nombresEstilo.length ]; ManejadorEstilo manejadorEstilo = new ManejadorEstilo(); // crear elementos de men tipo casilla de verificacin para el men Estilo for ( int cuenta = 0; cuenta < nombresEstilo.length; cuenta++ ) { elementosEstilo[ cuenta ] = new JCheckBoxMenuItem( nombresEstilo[ cuenta ] ); menuTiposLetra.add( elementosEstilo[ cuenta ] ); elementosEstilo[ cuenta ].addItemListener( manejadorEstilo ); } // colocar men Tipo de letra en el men Formato menuFormato.add( menuTiposLetra ); // agregar men Formato a la barra de mens barra.add( menuFormato ); // establecer etiqueta para mostrar texto pantallaEtiqueta = new JLabel( "Texto de SwingConstants.CENTER ); pantallaEtiqueta.setForeground( valoresColor[ 0 ] ); pantallaEtiqueta.setFont( new Font( "Serif", Font.PLAIN, 72 ) ); getContentPane().setBackground( Color.GREEN ); getContentPane().add( pantallaEtiqueta, BorderLayout.CENTER ); 114

ejemplo",

setSize( 550, 200 ); setVisible( true ); } // fin del constructor public static void main( String args[] ) { PruebaMenu aplicacion = new PruebaMenu(); aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } // clase interna para manejar eventos de accin de los elementos de men private class ManejadorEventos implements ActionListener { // procesar selecciones de color y tipo de letra public void actionPerformed( ActionEvent evento ) { // procesar seleccin de color for ( int cuenta = 0; cuenta < elementosColor.length; cuenta++ ) if ( elementosColor[ cuenta ].isSelected() ) { pantallaEtiqueta.setForeground( valoresColor[ cuenta ] ); break; } // procesar seleccin de tipo de letra for ( int cuenta = 0; cuenta < tiposLetra.length; cuenta++ ) if ( evento.getSource() == tiposLetra[ cuenta ] ) { pantallaEtiqueta.setFont( new Font( tiposLetra[ cuenta ].getText(), estilo, 72 ) ); break; } repaint(); } // fin del mtodo actionPerformed } // fin de la clase ManejadorEventos // clase interna para manejar eventos de los elementos de men tipo casilla de verificacin private class ManejadorEstilo implements ItemListener { // procesar selecciones de estilo de tipo de letra public void itemStateChanged( ItemEvent e ) { estilo = 0; 115

// checar seleccin de negrita if ( elementosEstilo[ 0 ].isSelected() ) estilo += Font.BOLD; // checar seleccin de cursiva if ( elementosEstilo[ 1 ].isSelected() ) estilo += Font.ITALIC; pantallaEtiqueta.setFont( new Font( pantallaEtiqueta.getFont().getName(), estilo, 72 ) ); repaint(); } } // fin de la clase ManejadorEstilo } // fin de la clase PruebaMenu

ACTIVIDAD
Cree el siguiente men

import java.awt.*; import java.awt.event.*; import com.sun.java.swing.*; public class java1411 extends JPanel { static final Boolean bT = new Boolean( true ); static final Boolean bF = new Boolean( false ); static ButtonGroup grupoBotones; 116

// Clase que se utiliza para crear los distintos tipos de mens que se // va a presentar en la ventana static class TipoMenu { TipoMenu( int i ) {} }; static final TipoMenu mi = new TipoMenu( 1 ); static final TipoMenu cb = new TipoMenu( 2 ); // Men con cajas de seleccin static final TipoMenu rb = new TipoMenu( 3 ); // Men con botones de radio JTextField txt = new JTextField( 10 ); JLabel lbl = new JLabel( "Icono Seleccionado",java1410.imgs[0], JLabel.CENTER ); ActionListener al1 = new ActionListener() { public void actionPerformed( ActionEvent evt ) { txt.setText( ((JMenuItem)evt.getSource() ).getText() ); } }; ActionListener al2 = new ActionListener() { public void actionPerformed( ActionEvent evt ) { JMenuItem mi = (JMenuItem)evt.getSource(); lbl.setText( mi.getText() ); lbl.setIcon( mi.getIcon() ); } }; // En estas estructuras se almacenas los datos de los mens como si se // tratara de los tpicos recursos de X public Object menuArchivo[][] = { // Nombre del men y tecla rpida asociada { "Archivo",new Character('A') }, // Nombre, tipo, tecla rpida, receptor asociado, habilitado o no // para cada uno de los elementos del men { "Nuevo",mi,new Character('N'),al1,bT }, { "Abrir",mi,new Character('b'),al1,bT }, { "Guardar",mi,new Character('G'),al1,bF }, { "Guardar como...",mi,new Character('c'),al1,bF }, { null }, // Separador { "Salir",mi,new Character('S'),al1,bT }, }; public Object menuEdicion[][] = { // Nombre del men y tecla rpida asociada { "Edicion",new Character('E') }, // Nombre, tipo, tecla rpida, receptor asociado, habilitado o no { "Cortar",mi,new Character('t'),al1,bT }, { "Copiar",mi,new Character('C'),al1,bT }, 117

{ "Pegar",mi,new Character('P'),al1,bT }, { null }, // Separator { "Seleccionar Todo",mi,new Character('S'),al1,bT }, };

public Object menuIconos[][] = { // Nombre del men y tecla rpida asociada { "Iconos",new Character('I') }, // Se le aade un ltimo elemento opcional que corresponde al // icono que se presenta en medio de la ventana { "Icono 0",rb,new Character('0'),al2,bT,Jmenus.imgs[0] }, { "Icono 1",rb,new Character('1'),al2,bT, Jmenus.imgs[1] }, { "Icono 2",rb,new Character('2'),al2,bT, Jmenus.imgs[2] }, { "Icono 3",rb,new Character('3'),al2,bT, Jmenus.imgs[3] }, { "Icono 4",rb,new Character('4'),al2,bT, Jmenus.imgs[4] }, }; public Object menuOpciones[][] = { // Nombre del men y tecla rpida asociada { "Opciones",new Character('O') }, // Nombre, tipo, tecla rpida, receptor asociado, habilitado o no { "Opcion 1",cb,new Character('1'),al1,bT }, { "Opcion 2",cb,new Character('2'),al1,bT }, }; public Object menuAyuda[][] = { // Nombre del men y tecla rpida asociada { "Ayuda",new Character('y') }, // Nombre, tipo, tecla rpida, receptor asociado, habilitado o no { "Indice",mi,new Character('I'),al1,bT }, { "Contenido",mi,new Character('C'),al1,bT }, { null }, // Separator { "Acerca de...",mi,new Character('A'),al1,bT }, }; public Object barraMenu[] = { menuArchivo,menuEdicion,menuIconos,menuOpciones,menuAyuda, }; static public JMenuBar creaMenuBarra( Object barraMenuDato[] ) { JMenuBar barraMenu = new JMenuBar(); for( int i=0; i < barraMenuDato.length; i++ ) barraMenu.add( creaMenu((Object[][])barraMenuDato[i]) ); return( barraMenu ); } 118

static public JMenu creaMenu( Object[][] menuDato ) { JMenu menu = new JMenu(); menu.setText( (String)menuDato[0][0] ); menu.setMnemonic( ((Character)menuDato[0][1]).charValue() ); grupoBotones = new ButtonGroup(); for( int i=1; i < menuDato.length; i++ ) { if( menuDato[i][0] == null ) menu.add( new JSeparator() ); else menu.add( creaMenuItem( menuDato[i] ) ); } return( menu ); } static public JMenuItem creaMenuItem( Object[] dato ) { JMenuItem m = null; TipoMenu tipo = (TipoMenu)dato[1]; if( tipo == mi ) m = new JMenuItem(); else if( tipo == cb ) m = new JCheckBoxMenuItem(); else if( tipo == rb ) { m = new JRadioButtonMenuItem(); grupoBotones.add( m ); } m.setText( (String)dato[0] ); m.setMnemonic( ((Character)dato[2]).charValue() ); m.addActionListener( (ActionListener)dato[3] ); m.setEnabled( ((Boolean)dato[4]).booleanValue() ); // Y ahora el caso opcional de los iconos if( dato.length == 6 ) m.setIcon( (Icon)dato[5] ); return( m ); } Jmenus () { setLayout( new BorderLayout() ); add( creaMenuBarra( barraMenu ),BorderLayout.NORTH ); JPanel p = new JPanel(); p.setLayout( new BorderLayout() ); p.add( txt,BorderLayout.NORTH ); p.add( lbl,BorderLayout.CENTER ); add( p,BorderLayout.CENTER ); } public static void main(String args[]) { 119

Jmenus panel = new Jmenus(); JFrame ventana = new JFrame(); ventana.getContentPane().add( panel,BorderLayout.CENTER ); ventana.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent evt ) { System.exit( 0 ); } } ); ventana.setSize( 300,200 ); ventana.setTitle( "Menus en Swing" ); ventana.setVisible( true ); } } Un objeto Icon es colocado en JLabel a travs de su constructor y cambiado cuando el correspondiente elemento del men est seleccionado.

PROPUESTOS
Cree un men popup Cree el men principal para su aplicacin final.

120

Potrebbero piacerti anche