Sei sulla pagina 1di 53

CAPITULO II Integrantes: Rosario Cueva. Jessica Cueva. Diana Farez.

Jhonny Gonzlez

2 CONSTRUCCION DE INTERFACES GRAFICAS CON SWING 2.1 Conceptos y Arquitecturas de Swing Cuando se empieza a utilizar Swing, se observa que JavaSoft ha dado un gran paso adelante respecto al AWT. Ahora los Componentes del interfaz grfico son Beans y utilizan el nuevo modelo de Delegacin de Eventos de Java. Swing proporciona un conjunto completo de Componentes, todos ellos lightweight, es decir, ya no se usan componentes "peer" dependientes del sistema operativo, y adems, Swing est totalmente escrito en Java. Todo ello redunda en una mayor funcionalidad en manos del programador, y en la posibilidad de mejorar en gran medida la cosmtica de los interfaces grficos de usuario. Son muchas las ventajas que ofrece el uso de Swing. Por ejemplo, la navegacin con el teclado es automtica, cualquier aplicacin Swing se puede utilizar sin ratn, sin tener que escribir ni una lnea de cdigo adicional. Las etiquetas de informacin, o "tool tips", se pueden crear con una sola lnea de cdigo. Adems, Swing aprovecha la circunstancia de que sus Componentes no estn renderizados sobre la pantalla por el sistema operativo para soportar lo que llaman "pluggable look and feel", es decir, que la apariencia de la aplicacin se adapta dinmicamente al sistema operativo y plataforma en que est corriendo. Los Componentes Swing no soportan el modelo de Eventos de Propagacin, sino solamente el modelo de Delegacin incluido desde el JDK 1.1; por lo tanto, si se van a utilizar componentes Swing, se debe programar exclusivamente en el nuevo modelo. El paso de AWT a Swing es muy sencillo y no hay que descartar nada de lo que se haya hecho con el AWT. Afortunadamente, los

programadores de Swing han tenido compasin y, en la mayora de los casos es suficiente con aadir una "J" al componente AWT para que se convierta en un componente Swing. Es muy importante entender y asimilar el hecho de que Swing es una extensin del AWT, y no un sustituto encaminado a reemplazarlo. Aunque esto sea verdad en algunos casos en que los componentes de Swing se corresponden a componentes del AWT; por ejemplo, el JButton de Swing puede considerarse como un sustituto del Button del AWT, y una vez que se usen los botones de Swing se puede tomar la decisin de no volver a utilizar jams un botn de AWT, pero, la funcionalidad bsica de Swing descansa sobre el AWT. Todo esto es para evitar que el lector salte directamente a Swing, ya que sera conveniente que primero entendiese el AWT y cmo Swing mejora al AWT. Por ahora, en este Tutorial solamente habr ejemplos de algunos de los componentes de Swing, porque lo suyo es que el lector consulte la informacin de JavaSoft, incluso a pesar de que est en ingls, porque las figuras que proporcionan en su tutorial son muy ilustrativas. Aqu, se reproducirn algunas, quiz no las ms interesantes, pero s las ms descriptivas. Hay muchos libros en los que aparecen estas figuras, que se usan como material de relleno para que parezca que el libro contiene ms informacin de la que en realidad posee; es ms, algunos de los libros que el autor ha hojeado (en ingls), no son ms que reproducciones de la documentacin que JavaSoft proporciona gratuitamente. Para la cuestin de ejemplos, los ms adecuados y espectaculares son los que proporciona JavaSoft con Swing, bajo la carpeta "examples" que se genera en la instalacin del JDK. Particularmente interesante es la aplicacin que ellos llaman SwingSet, cuya pantalla inicial es una ventana con una veintena de pestaas que corresponden, cada una de ellas, a uno de los aspectos de Swing. Si el lector quiere husmear en los ejemplos, es particularmente interesante el "Slider" y, por supuesto, seleccionar en el men de "Options" las diferentes apariencias con que se pueden mostrar los paneles. Swing, Revisin Para iniciar la entrada en Swing, qu mejor que implementar de nuevo otra versin del saludo inicial, pero con los componentes Swing, as que la versin del "Hola Mundo!", se convierte ahora en JHolaMundo.java, cuyo cdigo es el que sigue.

import com.sun.java.swing.*; public class JHolaMundo extends JFrame { public static void main( String argv[] ) { new JHolaMundo(); } JHolaMundo() { JLabel hola = new JLabel( "Hola Mundo!" ); getContentPane().add( hola,"Center" ); setSize( 200,100); setVisible( true ); } }

El siguiente ejemplo, java1401.java, aunque ya un poco ms en serio, tambin es muy sencillo y en l se pueden observar un poco mejor los cambios que introduce Swing, que son casi exclusivamente de nomenclatura.
import java.awt.*; import java.awt.event.*; import com.sun.java.swing.*; public class java1401 extends JPanel { JButton boton1 = new JButton( "JButton 1" ); JButton boton2 = new JButton( "JButton 2" ); JTextField texto = new JTextField( 20 ); public java1401() { ActionListener al = new ActionListener() { public void actionPerformed( ActionEvent evt ) { String nombre = ( (JButton)evt.getSource()).getText(); texto.setText( nombre+" Pulsado" ); } }; boton1.addActionListener( al ); boton1.setToolTipText( "Soy el JBoton 1" ); add( boton1 ); boton2.addActionListener( al ); boton2.setToolTipText( "Soy el JBoton 2" ); add( boton2 ); texto.setToolTipText( "Soy el JCampoDeTexto" ); add( texto ); } public static void main( String args[] ) { JFrame ventana = new JFrame( "Tutorial de Java, Swing" ); ventana.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent evt ){ System.exit( 0 ); } } ); ventana.getContentPane().add( new java1401(),BorderLayout.CENTER ); ventana.setSize( 300,100 );

ventana.setVisible( true ); } }

Si se excepta la nueva sentencia import, el resto del cdigo parece de AWT con una J delante de cada nombre de componente. Adems, no se puede aadir algo con add() a un JFrame, sino que hay que tener antes su contenido, tal como muestra tanto este ejemplo, como el anterior del saludo. Pero, vamos, con una simple conversin se tiene toda la potencia de Swing.

2.2 VENTANAS EN JAVA Una Ventana genrica, Window, puede utilizarse simplemente para que sea la clase padre de otras clases y se puede intercambiar por un Dilogo, Dialog, sin prdida de funcionalidad. No se puede decir lo mismo de un Frame. Se podra crear un men pop-up con una Ventana, pero lo cierto es que en esta versin del JDK hay un montn de bugs y no merece la pena el enfrascarse en el intento. No obstante, hay ciertos mtodos que estn en la clase Window y que no estn presentes en otras clases que pueden resultar interesantes y necesitar una Ventana si queremos emplearlos. Son:
getToolkit() getWarningString() pack() toBack() toFront()

Un Dilogo es una subclase de Window, que puede tener un borde y ser modal, es decir, no permite hacer nada al usuario hasta que responda al dilogo. Esto es lo que se usa en las cajas de dilogo "Acerca de...", en la seleccin en listas, cuando se pide una entrada numrica, etc. El cdigo Java que se expone a continuacin, implementa el dilogo Acerca de para la aplicacin. Esta clase se crea oculta y

necesitaremos llamar al mtodo show() de la propia clase para hacerla visible.


class AboutDialog extends Dialog { static int HOR_TAMANO = 300; static int VER_TAMANO = 150; public AboutDialog( Frame parent ) { super( parent,"Acerca de...",true ); this.setResizable( false ); setBackground( Color.gray ); setLayout( new BorderLayout() ); Panel p = new Panel(); p.add( new Button( "Aceptar" ) ); add( "South",p ); resize( HOR_TAMANO,VER_TAMANO ); } public void paint( Graphics g ) { g.setColor( Color.white ); g.drawString( "Aplicacin Java con AWT", HOR_TAMANO/4,VER_TAMANO/3 ); g.drawString( "Versin 1.00", HOR_TAMANO/3+15,VER_TAMANO/3+20 ); } public boolean handleEvent( Event evt ) { switch( evt.id ) { case Event.ACTION_EVENT: {

if( "Aceptar".equals( evt.arg ) ) { hide(); return true; } } default: return false; } } }

La ventana que aparece en pantalla generada por la clase anterior es la que muestra la figura:

Las aplicaciones independientes deberan heredar tomando como padre la ventana principal de esa aplicacin. As pueden implementar la interface MenuContainer y proporcionar mens. No hay razn aparente para que sea una subclase de la clase Frame, pero si se quiere proporcionar funcionalidad extra, s debera serlo, en vez de serlo de su padre: Window. Esto es as porque Frame implementa la interface MenuContainer, con lo cual tiene la posibilidad de proporcionar mens y cambiar el cursor, el icono de la aplicacin, etc. Un ejemplo ms complicado de aplicacin grfica basada en el AWT es el convertidor de decimal a binario/octal/hexadecimal/base36, Convertidor.java, cuya presentacin en pantalla es la que muestra la figura siguiente.

PANELES La clase Panel es el ms simple de los Contenedores de Componentes grficos. En realidad, se trataba de crear una clase no-abstracta (Container s lo es) que sirviera de base a los applet y a otras pequeas aplicaciones. La clase Panel consta de dos mtodos propios: el constructor, cuyo fin es crear un nuevo Panel con un LayoutManager de tipo FlowLayout (el de defecto), y el mtodo addNotify() que, sobrecargando la funcin del mismo nombre en la clase Container, llama al mtodo createPanel() del Toolkit adecuado, creando as un PanelPeer. El AWT enviar as al Panel (y por tanto al applet) todos los eventos que sobre l ocurran. Esto que puede parecer un poco rebuscado, obedece al esquema arquitectnico del AWT; se trata del bien conocido esquema de separacin interface/implementacin que establece por un lado una clase de interface y por otro distintas clases de implementacin para cada una de las plataformas elegidas. El uso de Paneles permite que las aplicaciones puedan utilizar mltiples layouts, es decir, que la disposicin de los componentes sobre la ventana de visualizacin pueda modificarse con mucha flexibilidad. Permite que cada Contenedor pueda tener su propio esquema de fuentes de caracteres, color de fondo, zona de dilogo, etc. Podemos, por ejemplo, crear una barra de herramientas para la zona superior de la ventana de la aplicacin o incorporarle una zona de estado en la zona inferior de la ventana para mostrar informacin til al usuario. Para ello vamos a implementar dos Paneles:
class BarraHerram extends Panel { public BarraHerram() { setLayout( new FlowLayout() ); add( new Button( "Abrir" ) );

add( new Button( "Guardar" ) ); add( new Button( "Cerrar" ) ); Choice c = new Choice(); c.addItem( "Times Roman" ); c.addItem( "Helvetica" ); c.addItem( "System" ); add( c ); add( new Button( "Ayuda" ) ); } } class BarraEstado extends Panel { Label texto; Label mas_texto;

public BarraEstado() { setLayout( new FlowLayout() ); add( texto = new Label( "Creada la barra de estado" ) ); add( mas_texto = new Label( "Informacin adicional" ) ); } public void verEstado( String informacion ) { texto.setText( informacion ); }

} Ahora, para dar funcionalidad, debemos crear los objetos correspondientes a la barra de herramientas y a la barra de estado con new; al contrario que en C++, en Java todos los objetos deben ser creados con el operador new:

add( "North",tb = new ToolBar() ); add( "South",sb = new StatusBar() ); Tambin vamos a incorporar un nuevo evento a nuestro controlador, para que maneje los eventos de tipo ACTION_EVENT que le llegarn cuando se pulsen los botones de la barra de herramientas o se realice alguna seleccin, etc.
case Event.ACTION_EVENT: { be.verEstado( evt.arg.toString() ); return true; }

Cuando la aplicacin reciba este tipo de evento, alterar el contenido de la barra de estado para mostrar la informacin de la seleccin realizada o el botn pulsado. JFrame Las siguientes tablas listan los mtodos y constuctores ms utilizados de JFrame. Existen otros mtodos que podramos llamar y que estn definidos en las clases Frame y Window y que incluyen pack, setSize, show, hide, setVisible, setTitle, y getTitle. La mayor parte de la opracin de un frame est manejada por otros objetos. Por ejemplo, el interior de un frame est manejado por su panel raz, y el panel de contenido contiene el GUI del frame. El API para utilizar Frames se divide en dos categoras.

Crear y Configurar un Frame Seleccionar y Obtener los objetos auxiliares de un Frame

Crear y configurar un Frame Mtodo JFrame() JFrame(String) Propsito Crea un frame. El argumento String proporciona el ttulo del frame.

void setDefaultCloseOperation (int) int getDefaultCloseOperatio n()

Selecciona u obtiene la operacin que ocurre cuando el usuario pulsa el botn de cerrar la ventana. Las posibles elecciones son.

DO_NOTHING_ON_CLOSE HIDE_ON_CLOSE (por defecto) DISPOSE_ON_CLOSE

Estas constantes estn definidas en el interface WindowConstants.

Seleccionar y Obtener los objetos auxiliares de un Frame Mtodo Propsito

void setContentPane(Container Selecciona u obtiene el panel de ) contenido del frame. Tambin se puede hacer a travs del panel raz del frame. Container getContentPane() JRootPane createRootPane() Crea, selecciona u obtiene el panel raz del frame. El panel raz maneja el void interior de frame, incluyendo el panel setRootPane(JRootPane) de contendido, el panel transparente, etc. JRootPane getRootPane() void Selecciona u obtiene la barra de men setJMenuBar(JMenuBar) del frame. Tambin se puede hacer a travs del panel raz del frame. JMenuBar getJMenuBar() void Selecciona u obtiene el panel setGlassPane(Component) transparente del frame. Tambin se puede hacer a travs del panel raz del Component frame. getGlassPane() void setLayeredPane(JLayeredP Selecciona u obtiene el panel de capas ane) del frame. Tambin se puede hacer a travs del panel raz del frame. JLayeredPane getLayeredPane() 2.3 COMPONENTES Y CONTENEDORES: GERARQUIA DE CLASES Una interface grfica est construida en base a elementos grficos bsicos, los Componentes. Tpicos ejemplos de estos Componentes son los botones, barras de desplazamiento, etiquetas, listas, cajas de

seleccin o campos de texto. Los Componentes permiten al usuario interactuar con la aplicacin y proporcionar informacin desde el programa al usuario sobre el estado del programa. En el AWT, todos los Componentes de la interface de usuario son instancias de la clase Component o uno de sus subtipos. Los Componentes no se encuentran aislados, sino agrupados dentro de Contenedores. Los Contenedores contienen y organizan la situacin de los Componentes; adems, los Contenedores son en s mismos Componentes y como tales pueden ser situados dentro de otros Contenedores. Tambin contienen el cdigo necesario para el control de eventos, cambiar la forma del cursor o modificar el icono de la aplicacin. En el AWT, todos los Contenedores son instancias de la clase Container o uno de sus subtipos. En la imagen siguiente presentamos una interface de usuario muy simple, con la apariencia que presenta cuando se visualiza bajo Windows '95.

Los Componentes deben circunscribirse dentro del Contenedor que los contiene. Esto hace que el anidamiento de Componentes (incluyendo Contenedores) en Contenedores crean rboles de elementos, comenzando con un Contenedor en la raiz del rbol y expandindolo en sus ramas. A continuacin presentamos el rbol que representa la interface que corresponde con la aplicacin grfica generada anteriormente.

TIPOS DE COMPONENTES

En el rbol siguiente mostramos la relacin que existe entre todas las clases que proporciona AWT para la creacin de interfaces de usuario, presentando la jerarqua de Clases e Interfaces: Clases:

BorderLayout CardLayout CheckboxGroup Color Component o Button o Canvas o Checkbox o Choice o Container Panel Window Dialog Frame o Label o List o Scrollbar o TextComponent TextArea TextField o Dimension o Event o FileDialog o FlowLayout o Font o FontMetrics o Graphics o GridLayout o GridBagConstraints o GridBagLayout o Image o Insets o MediaTracker o MenuComponent MenuBar MenuItem CheckboxMenuItem

o o o o

Menu

Point Polygon Rectangle Toolkit

2.4 PRINCIPIOS Y TIPOS DE COMPONENTES SWING En este captulo, vamos a cubrir todos los componentes de interfaz de usuario. En el prximo captulo, vamos a cubrir algunos de los que participan ms temas: componentes de texto, los rboles, tablas, y la creacin de sus propios componentes. Botones y etiquetas Empezaremos con los componentes ms simple: botones y etiquetas. Francamente, no hay mucho que decir acerca de ellos. Si has visto un botn, has visto a todos ellos, y ya has visto los botones de las aplicaciones en el captulo 2, una primera solicitud HelloJava3 y HelloJava4 Un botn genera un ActionEvent cuando el usuario presiona la misma. Para recibir estos acontecimientos, el programa registra un ActionListener que debe aplicar el actionPerformed( ) mtodo. El argumento pasa a actionPerformed( ) es el evento en s. Hay una cosa ms vale la pena decir acerca de los botones, que se aplica a cualquier componente que genera un evento de accin. Java nos permite especificar una "accin comando" para la cadena de botones (y otros componentes, como los elementos de men, que puede generar eventos de accin). La accin de mando es menos interesante de lo que suena. Es simplemente String cadena que sirve para identificar el componente que envi al evento. De forma predeterminada, la accin de un comando JButton es el mismo que su etiqueta, que est incluido en los eventos de accin, de modo que pueda utilizarlo para averiguar qu botn de un caso de vino. Para obtener la accin de un comando de accin evento, el evento getActionCommand( ) mtodo. El cdigo siguiente comprueba si el usuario pulsa el botn S:
public void actionPerformed(ActionEvent e){ if (e.getActionCommand( ).equals("Yes") { //the user pressed "Yes"; do something ... } }

Puede cambiar el comando de accin llamando a la del botn setActionCommand( ) mtodo. Los siguientes cambios en el cdigo botn myButton 's accin comando para "confirmar": myButton.setActionCommand("confirm"); Es una buena idea para acostumbrarse a establecer explcitamente los comandos de accin, lo que ayuda a prevenir el cdigo de romper cuando usted o algn otro desarrollador "internacionaliza", o de otro modo los cambios en el botn de la etiqueta. Si se basan en el botn de la etiqueta, el cdigo dejar de funcionar tan pronto como los cambios que la etiqueta; francs un usuario puede ver la etiqueta Oui en lugar de Yes Con el establecimiento de la accin comando, eliminar una fuente de errores, por ejemplo, el botn myButton en el ejemplo anterior siempre generar la accin comando confirm independientemente de lo que dice su etiqueta. Swing botones pueden tener una imagen adems de una etiqueta. El JButton clase incluye los constructores que acepten un Icon objeto, que sabe cmo llamar a s mismo. Puede crear botones con leyendas, imgenes, o ambas cosas. A mano clase llamada ImageIcon se ocupa de la carga de una imagen para usted y puede ser usado para agregar fcilmente una imagen a un botn. El siguiente ejemplo muestra cmo funciona esto:
//file: PictureButton.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class PictureButton extends JFrame { public PictureButton( ) { super("PictureButton v1.0"); setSize(200, 200); setLocation(200, 200); Icon icon = new ImageIcon("rhino.gif"); JButton button = new JButton(icon); button.addActionListener(new ActionListener( ) { public void actionPerformed(ActionEvent ae) { System.out.println("Urp!"); } }); Container content = getContentPane( ); content.setLayout(new FlowLayout( )); content.add(button);

} public static void main(String[] args) { JFrame f = new PictureButton( ); f.addWindowListener(new WindowAdapter( ) { public void windowClosing(WindowEvent we) { System.exit(0); } }); f.setVisible(true); } }

El ejemplo crea una ImageIcon de la rhino.gif archivo. A continuacin, un JButton se crea a partir de la ImageIcon Todo esto se muestra en un JFrame Este ejemplo muestra tambin la expresin de la utilizacin de un annimo interior como una clase ActionListener Hay an menos que decir sobre JLabel componentes. Son slo cadenas de texto o imgenes alojadas en un componente. No hay eventos especiales asociados con las etiquetas, sobre todo lo que puedes hacer es especificar la alineacin del texto, que controla la posicin del texto dentro de la etiqueta del rea de visualizacin. Al igual que con los botones, JLabel s se pueden crear con el Icon S si desea crear una etiqueta de imagen. El siguiente cdigo crea algunas etiquetas con diferentes opciones:
// default alignment (CENTER) JLabel label1 = new JLabel("Lions"); // left aligned JLabel label2 = new JLabel("Tigers", SwingConstants.LEFT); //label with no text, default alignment JLabel label3 = new JLabel( ); // create image icon Icon icon = new ImageIcon("rhino.gif"); // create image label JLabel label4 = new JLabel(icon); // assigning text to label3 label3.setText("and Bears"); // set alignment label3.setHorizontalAlignment(SwingConstants.RIGHT);

La alineacin constantes estn definidas en el SwingConstants interfaz.

Ahora hemos creado varias etiquetas, utilizando una variedad de constructores y varios de los mtodos de la clase. Para mostrar las etiquetas, slo tiene que aadirlas a un contenedor llamando al contenedor de add( ) mtodo. Las otras caractersticas que quizs te gustara para establecer en las etiquetas, como por ejemplo cambiar su tipo de letra o color, se realizan utilizando los mtodos de la Component JLabel 's lejano antepasado. Por ejemplo, usted puede llamar setFont( ) setColor( ) en una etiqueta, al igual que con cualquier otro componente. Habida cuenta de que las etiquetas son tan simples, por qu necesitamos de todos ellos? Por qu no establecer una cadena de texto directamente en el objeto contenedor? Recuerde que un JLabel es una JComponent Eso es importante, que significa que las etiquetas tienen el complemento normal de los mtodos de fijacin de tipos de letra y colores que hemos mencionado anteriormente, as como la capacidad de ser administrado por un razonable gestor de diseo. Por lo tanto, son mucho ms flexible que una cadena de texto preparado en absoluto un lugar dentro de un contenedor. Hablando de diseos - Si utiliza el setText( ) mtodo para cambiar el texto de su etiqueta, la etiqueta del tamao preferido puede cambiar. Sin embargo, la etiqueta del contenedor automticamente establecer sus componentes cuando esto sucede, por lo que no tendr que preocuparse de ello. Swing puede interpretar en formato HTML en el texto JLabel y JButton etiquetas. El siguiente ejemplo muestra cmo crear un botn con formato HTML de texto: JButton button = new JButton( "<html>" + "S<font size=-1>MALL<font size=+0> " + "C<font size=-1>APITALS"); Casillas de verificacin y botones de radio Una casilla de verificacin es un conmutador marcado. Cada vez que el usuario hace clic en l, su estado cambia entre controlados y sin control. Swing implementa en la casilla de verificacin como un tipo especial de botn. Radio botones son similares a las casillas de verificacin, pero son normalmente dispuestos en grupos. Haga clic

en un botn en el grupo, y los otros apagar automticamente. Ellos se llaman los preset de botones en radios de autos antiguos. Casillas de verificacin y botones de radio estn representados por los casos de JCheckBox y JRadioButton respectivamente. Radio botones pueden ser atados juntos mediante una instancia de otra clase llamada ButtonGroup En la actualidad usted est probablemente bien entrado el swing de las cosas (sin juego de palabras la intencin) y puede fcilmente dominar estas clases por su cuenta. Usaremos un ejemplo para ilustrar una forma diferente de tratar con el estado de los componentes y para mostrar un poco ms cosas acerca de los contenedores. A JCheckBox enva ItemEvent s cuando es presionado. Desde una casilla de verificacin es una especie de botn, sino que tambin los incendios ActionEvent s cuando se convierte en control. Por algo as como una casilla de verificacin, que podra querer ser perezoso y comprobar sobre el estado de los botones slo en algn otro momento, como cuando el usuario comete una accin. Es como llenar un formulario, puede cambiar sus opciones hasta que enve el formulario. La siguiente aplicacin, DriveThrough nos permite marcar las selecciones en un men de comida rpida, como se muestra en la Figura 14-1. DriveThrough imprime los resultados cuando se pulse el botn "comprar". Por lo tanto, podemos hacer caso omiso de todos los eventos generados por nuestras casillas de verificacin y botones de radio y escuchar slo para la accin de los eventos que genera el botn regular.
//file: DriveThrough.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class DriveThrough { public static void main(String[] args) { JFrame f = new JFrame("Lister v1.0"); f.setSize(300, 150); f.setLocation(200, 200); f.addWindowListener(new WindowAdapter( ) { public void windowClosing(WindowEvent we) { System.exit(0); } }); JPanel entreePanel = new JPanel( ); final ButtonGroup entreeGroup = new ButtonGroup( );

JRadioButton radioButton; entreePanel.add(radioButton = new JRadioButton("Beef")); radioButton.setActionCommand("Beef"); entreeGroup.add(radioButton); entreePanel.add(radioButton = new JRadioButton("Chicken")); radioButton.setActionCommand("Chicken"); entreeGroup.add(radioButton); entreePanel.add(radioButton = new JRadioButton("Veggie", true)); radioButton.setActionCommand("Veggie"); entreeGroup.add(radioButton); final JPanel condimentsPanel = new JPanel( ); condimentsPanel.add(new JCheckBox("Ketchup")); condimentsPanel.add(new JCheckBox("Mustard")); condimentsPanel.add(new JCheckBox("Pickles")); JPanel orderPanel = new JPanel( ); JButton orderButton = new JButton("Place Order"); orderPanel.add(orderButton); Container content = f.getContentPane( ); content.setLayout(new GridLayout(3, 1)); content.add(entreePanel); content.add(condimentsPanel); content.add(orderPanel); orderButton.addActionListener(new ActionListener( ) { public void actionPerformed(ActionEvent ae) { String entree = entreeGroup.getSelection().getActionCommand( ); System.out.println(entree + " sandwich"); Component[] components = condimentsPanel.getComponents( ); for (int i = 0; i < components.length; i++) { JCheckBox cb = (JCheckBox)components[i]; if (cb.isSelected( )) System.out.println("With " + cb.getText( )); } } }); f.setVisible(true); } }

Figura 14-1. DriveThrough

La

aplicacin

DriveThrough establece tres grupos. Los botones de radio en el entreePanel estn atados juntos a travs de un ButtonGroup objeto. add( ) los botones para una ButtonGroup para que sean mutuamente excluyentes. El ButtonGroup objeto es un extrao animal. Uno espera que sea un contenedor o un componente, pero no lo es, es simplemente un objeto auxiliar que permite que slo un RadioButton que se elegirn a la vez. En este ejemplo, el botn de grupo te obliga a elegir un sector de la carne, pollo, vegetales o entrada, pero no ms de uno. El condimento opciones, que son JCheckBox es, no estn en un botn de grupo, por lo que puede solicitar cualquier combinacin de ketchup, mostaza, pepinillos y en su sndwich. Cuando el botn "comprar" es empujado, que recibimos un ActionEvent en el actionPerformed( ) el mtodo de nuestro interior ActionListener En este punto, nos reunimos la informacin en los botones y casillas de verificacin e imprimirlo. actionPerformed( ) simplemente lee el estado de los diferentes botones. Nos podra haber salvado las referencias a los botones en un nmero de maneras, este ejemplo demuestra dos. En primer lugar, averiguar qu entrada fue seleccionado. Para ello, pedimos la ButtonGroup 's getSelection( ) mtodo. Esto devuelve un ButtonModel a la que llamar inmediatamente getActionCommand( ) Esta accin devuelve el comando conjunto como cuando hemos creado los botones de radio. La accin de comandos de los botones son los nombres de las empresas, que es exactamente lo que necesitamos. Para averiguar qu condimentos fueron seleccionados, utilizamos un procedimiento ms complicado. El problema es que los condimentos no son mutuamente excluyentes, por lo que no tenemos la comodidad de un ButtonGroup En lugar de ello, pedimos a los condimentos JPanel para obtener una lista de sus componentes. El getComponents( ) mtodo devuelve una serie de referencias en el contenedor infantil de los componentes. Usaremos este bucle a lo largo de los componentes y los resultados de impresin. Estamos emitidos cada uno de los elementos de la matriz de vuelta a

JCheckBox y llame a su isSelected( ) mtodo para ver si la casilla est activada o desactivada. Si se trata de diferentes tipos de componentes de la matriz, que puede determinar cada uno de los componentes del tipo con el instanceof operador. Listas y cuadros combinados JList S y JComboBox es son un paso en la cadena evolutiva de JButton S y JLabel s. Listas permite al usuario elegir entre un grupo de alternativas. Pueden ser configurados para obligar al usuario a elegir una sola seleccin o para permitir mltiples opciones. Normalmente, slo un pequeo grupo de opciones se muestran en un momento, una barra de desplazamiento permite al usuario desplazarse a las opciones que no son visibles. El usuario puede seleccionar un tema haciendo clic en l. l o ella puede ampliar la seleccin a una serie de elementos, mantenga pulsada SHIFT y hacer clic sobre otro tema. Para hacer selecciones discontinuas, el usuario puede mantener pulsada la tecla Control en lugar de la tecla Shift. Un cuadro combinado es una raza cruzada entre un campo de texto y una lista. Se muestra una sola lnea de texto (posiblemente con una imagen) y una flecha que apunta hacia la baja en un lado. Si hace clic en la flecha, el cuadro combinado se abre y muestra una lista de opciones. Puede seleccionar una nica opcin haciendo clic en l. Despus de una seleccin se haga, el cuadro combinado se cierra hasta la lista desaparece y la nueva seleccin se muestra en el campo de texto. Como cualquier otro componente de Swing, listas y cuadros combinados tienen modelos de datos que son distintos de los componentes visuales. La lista tambin tiene un modelo de seleccin que controla la seleccin puede hacerse en la lista de datos. Listas y cuadros combinados son similares porque tienen similares modelos de datos. Cada una de ellas es simplemente una variedad de opciones aceptables. Esta similitud se refleja en el swing, por supuesto: el tipo de un JComboBox 's modelo de datos es una subclase del tipo de las utilizadas para una JList s modelo de datos. El siguiente ejemplo muestra esta relacin. El siguiente ejemplo crea una ventana con un cuadro combinado, una lista, y un botn. El cuadro combinado y la lista utilizar el mismo modelo de datos. Al pulsar el botn, el programa escribe la actual

serie de temas seleccionados en la lista. Figura 14-2 muestra el ejemplo, el siguiente cdigo en s. Figura 14-2. Un cuadro combinado y una lista utilizando el mismo modelo de datos

/file: Lister.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Lister { public static void main(String[] args) { JFrame f = new JFrame("Lister v1.0"); f.setSize(200, 200); f.setLocation(200, 200); f.addWindowListener(new WindowAdapter( ) { public void windowClosing(WindowEvent we) { System.exit(0); } }); // create a combo box String [] items = { "uno", "due", "tre", "quattro", "cinque", "sei", "sette", "otto", "nove", "deici", "undici", "dodici" }; JComboBox comboBox = new JComboBox(items); comboBox.setEditable(true); // create a list with the same data model final JList list = new JList(comboBox.getModel( )); // create a button; when it's pressed, print out // the selection in the list JButton button = new JButton("Per favore"); button.addActionListener(new ActionListener( ) { public void actionPerformed(ActionEvent ae) { Object[] selection = list.getSelectedValues( ); System.out.println("-----"); for (int i = 0; i < selection.length; i++) System.out.println(selection[i]); } }); // put the controls the content pane

Container c = f.getContentPane( ); JPanel comboPanel = new JPanel( ); comboPanel.add(comboBox); c.add(comboPanel, BorderLayout.NORTH); c.add(new JScrollPane(list), BorderLayout.CENTER); c.add(button, BorderLayout.SOUTH); f.setVisible(true); } }

El cuadro combinado se crea a partir de una matriz de cadenas. Esta es una conveniencia - detrs de las escenas, el JComboBox constructor crea un modelo de datos de las cadenas de suministro y que establece el JComboBox a utilizar ese modelo de datos. La lista se crea utilizando el modelo de datos del cuadro combinado. Esto funciona porque JList espera utilizar un ListModel para su modelo de datos, y la ComboBoxModel utilizado por el JComboBox es una subclase de ListModel El botn de la accin de eventos simplemente imprime los elementos seleccionados en la lista, que se recuperan con una llamada a getSelectedValues( ) Este mtodo realmente devuelve un objeto array, no una cadena de la matriz. Lista y cuadro combinado elementos, al igual que muchas otras cosas en Swing, no se limitan al texto. Puede utilizar imgenes o dibujos, o una combinacin de texto e imgenes. Usted puede esperar que la seleccin de un tema en el cuadro combinado se seleccione el mismo tema en la lista. En los componentes Swing, la seleccin es controlado por un modelo de seleccin. El cuadro combinado y la lista tienen diferentes modelos de seleccin, despus de todo, usted puede seleccionar slo un elemento del cuadro combinado, mientras que es posible seleccionar varios elementos de la lista. As pues, si bien los dos componentes comparten un modelo de datos, se han separado de seleccin de modelos. Hemos hecho el cuadro combinado editable. De forma predeterminada, no sera modificable: el usuario slo podra elegir uno de los elementos de la lista desplegable. Con un cuadro combinado editable, el usuario puede escribir en una seleccin, como si se tratara de un campo de texto. No editable cuadros combinados son tiles si lo que quiere es ofrecer un conjunto limitado de

opciones; editar cuadros combinados son tiles cuando se desea aceptar cualquier oferta de entrada, pero algunas de las opciones. Hay una gran clase escondido en el ltimo ejemplo que merece cierto reconocimiento. Es JScrollPane En Lister usted notar que hemos creado un aadido cuando List lista a la ventana principal. JScrollPane simplemente se enrosca alrededor de Component componente y proporciona barras de desplazamiento cuando sea necesario. Mostrar las barras de desplazamiento si la figura Component S prefirieron tamao (tal y como lo devuelve por getPreferredSize( ) es mayor que el tamao de la JScrollPane s mismo. En el ejemplo anterior, las barras de desplazamiento aparecen cuando el tamao List la lista excede el espacio disponible. Puede utilizar JScrollPane para envolver Component componente, incluidos los componentes con dibujos o imgenes, o complejos paneles de interfaz de usuario. Vamos a discutir JScrollPane con ms detalle ms adelante en este captulo, y vamos a utilizar con frecuencia el texto con componentes en el prximo captulo. Mens A JMenu es un men desplegable con un nombre fijo. Los mens pueden contener otros mens como submen temas, lo que le permite aplicar complejas estructuras de men. En Swing, los mens son de primera clase de componentes, al igual que todo lo dems. Puede colocar siempre que sea un componente de ir. Otra clase, JMenuBar tiene mens en una barra horizontal. Barras de mens son reales los componentes, demasiado, por lo que puede colocarlos donde quieras en un contenedor: superior, inferior, o medio. Pero en medio de un contenedor, por lo general tiene ms sentido usar un JComboBox en lugar de algn tipo de men. Elementos de men puede tener asociadas imgenes y las teclas de acceso rpido, hay an elementos de men que se parecen a las casillas de verificacin y botones de radio. Elementos de men son en realidad una especie de botn. Al igual que los botones, los elementos del men de accin acontecimientos fuego cuando estn seleccionados. Puede responder a los elementos del men de accin por el registro de los oyentes con ellos. Hay dos maneras de utilizar el teclado con los mens. La primera se llama mnemotcnicos. A mnemotcnico es un personaje en el men

de nombre. Si usted mantenga pulsada la tecla Alt y escriba un mnemotcnico del men, el men desplegable, as como si ha hecho clic en l con el ratn. Elementos de men tambin puede tener mnemotcnicos. Una vez que un men se ha cado hacia abajo, puede seleccionar los elementos individuales de la misma manera. Elementos de men tambin puede tener aceleradores. Un acelerador es una combinacin de teclas que selecciona el elemento de men, ya sea o no el men que lo contiene est mostrando. Un ejemplo comn es el acelerador Ctrl-C, que se utiliza con frecuencia como un acceso directo para el tema Copiar en el men Editar. El siguiente ejemplo muestra varias caractersticas de los mens. Crea una barra de men con tres mens diferentes. La primera, utensilios, contiene varios elementos de men, un submen, un separador, y un tema que Salga incluye tanto un mnemotcnico y un acelerador. El segundo men, especias, contiene elementos de men que se ven y actan como casillas de verificacin. Por ltimo, el Queso de men se muestra cmo botn de elementos de men se pueden utilizar. Esta aplicacin se muestra en la Figura 14-4 con uno de sus mens disminuy. Elegir Quit desde el men (o presionando Ctrl-Q) elimina la ventana. Darle una oportunidad.
//file: DinnerMenu.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class DinnerMenu extends JFrame { public DinnerMenu( ) { super("DinnerMenu v1.0"); setSize(200, 200); setLocation(200, 200); // create the Utensils menu JMenu utensils = new JMenu("Utensils"); utensils.setMnemonic(KeyEvent.VK_U); utensils.add(new JMenuItem("Fork")); utensils.add(new JMenuItem("Knife")); utensils.add(new JMenuItem("Spoon")); JMenu hybrid = new JMenu("Hybrid"); hybrid.add(new JMenuItem("Spork")); hybrid.add(new JMenuItem("Spife")); hybrid.add(new JMenuItem("Knork")); utensils.add(hybrid);

utensils.addSeparator( ); // do some fancy stuff with the Quit item JMenuItem quitItem = new JMenuItem("Quit"); quitItem.setMnemonic(KeyEvent.VK_Q); quitItem.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_Q, Event.CTRL_MASK)); quitItem.addActionListener(new ActionListener( ) { public void actionPerformed(ActionEvent e) { System.exit(0); } }); utensils.add(quitItem); // create the Spices menu JMenu spices = new JMenu("Spices"); spices.setMnemonic(KeyEvent.VK_S); spices.add(new JCheckBoxMenuItem("Thyme")); spices.add(new JCheckBoxMenuItem("Rosemary")); spices.add(new JCheckBoxMenuItem("Oregano", true)); spices.add(new JCheckBoxMenuItem("Fennel")); // create the Cheese menu JMenu cheese = new JMenu("Cheese"); cheese.setMnemonic(KeyEvent.VK_C); ButtonGroup group = new ButtonGroup( ); JRadioButtonMenuItem rbmi; rbmi = new JRadioButtonMenuItem("Regular", true); group.add(rbmi); cheese.add(rbmi); rbmi = new JRadioButtonMenuItem("Extra"); group.add(rbmi); cheese.add(rbmi); rbmi = new JRadioButtonMenuItem("Blue"); group.add(rbmi); cheese.add(rbmi); // create a menu bar and use it in this JFrame JMenuBar menuBar = new JMenuBar( ); menuBar.add(utensils); menuBar.add(spices); menuBar.add(cheese); setJMenuBar(menuBar); } public static void main(String[] args) { JFrame f = new DinnerMenu( ); f.addWindowListener(new WindowAdapter( ) { public void windowClosing(WindowEvent we) { System.exit(0); } }); f.setVisible(true); } }

Figura 14-4. La aplicacin DinnerMenu

S, lo sabemos. Salga no tiene cabida en el men de utensilios. Si es usted loco de conduccin, se puede volver atrs y aadir un men Archivo como un ejercicio cuando estamos a travs de. Creacin de mens es bastante simple trabajo. Puede crear una JMenu objeto, especificando el ttulo del men. [1] A continuacin, que acaba de aadir JMenuItem s para la JMenu Tambin puede aadir JMenu s para un JMenu que muestran como submens. Esto se muestra en la creacin de los utensilios de men:
JMenu utensils = new JMenu("Utensils"); utensils.setMnemonic(KeyEvent.VK_U); utensils.add(new JMenuItem("Fork")); utensils.add(new JMenuItem("Knife")); utensils.add(new JMenuItem("Spoon")); JMenu hybrid = new JMenu("Hybrid"); hybrid.add(new JMenuItem("Spork")); hybrid.add(new JMenuItem("Spife")); hybrid.add(new JMenuItem("Knork")); utensils.add(hybrid);

En la segunda lnea, nos fijamos el nemotcnico para este men mediante una constante definida en el KeyEvent clase. Usted puede agregar las lneas de separacin bastante con una sola llamada: utensils.addSeparator( ); El elemento de men Salir tiene algunas campanas y silbatos que debera explicar. En primer lugar, vamos a crear el elemento de men y configurar su mnemotcnico, al igual que hicimos antes de utensilios para el men: JMenuItem quitItem = new JMenuItem("Quit"); quitItem.setMnemonic(KeyEvent.VK_Q); Ahora queremos crear un acelerador para el elemento de men. Hacemos esto con la ayuda de una clase llamada KeyStroke

quitItem.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_Q, Event.CTRL_MASK)); Por ltimo, para realmente hacer algo en respuesta a la opcin del men, que registro un oyente de accin: quitItem.addActionListener(new ActionListener( ) { public void actionPerformed(ActionEvent e) { System.exit(0); } }); Nuestro accin oyente sale de la aplicacin cuando el tema es dejar de seleccionados. Creacin de las especias del men es tan fcil, salvo que usamos JCheckBoxMenuItem s en lugar de regular JMenuItem s. El resultado es un men completo de los temas que se comportan como casillas de verificacin. El siguiente men, el queso, es un poco ms difcil. Queremos que los temas que habrn de botones de radio, pero tenemos que ponerlos en un ButtonGroup para asegurarse de que son mutuamente excluyentes. Cada tema, entonces, se ha creado, agreg el botn de grupo, y aadi al men en s. El paso final es colocar los mens que hemos creado en un JMenuBar Esto es simplemente un componente que establece los mens en una barra horizontal. Tenemos dos opciones para aadir a nuestro JFrame Desde la JMenuBar es un componente real, podramos aadir que el contenido del panel de la JFrame En lugar de ello, usamos un mtodo llamado conveniencia setJMenuBar( ) que coloca automticamente la JMenuBar en la parte superior del marco del panel de contenido. Esto nos ahorra la molestia de alterar el diseo o el tamao del panel de contenido, sino que se ajusta a coexistir pacficamente con la barra de mens. La clase PopupMenu Una de Swing de los componentes es elegante JPopupMenu un men que aparece automticamente cuando se presiona el botn del ratn dentro de un componente. (En un sistema Windows, por ejemplo, al hacer clic en el botn derecho del ratn invoca un men emergente.) Qu botn pulsar depende de la plataforma en la que est utilizando, afortunadamente, no tiene a la atencin mdica - Swing cifras que para usted .

El cuidado y alimentacin de JPopupMenu es bsicamente el mismo que cualquier otro men. Puede utilizar un constructor JPopupMenu( ) para crear, pero de lo contrario, construir un men y aadir elementos a l del mismo modo. La gran diferencia es que no es necesario adjuntarlo a un JMenuBar Por el contrario, slo aparecer el men siempre que usted lo necesite. El siguiente ejemplo, PopupColorMenu contiene tres botones. Puede utilizar un JPopupMenu para configurar el color de cada botn o el marco en s, dependiendo de donde usted presione el ratn. Figura 14-5 muestra el ejemplo de la accin, el usuario se est preparando para cambiar el color del botn inferior. Figura 14-5. PopupColorMenu La aplicacin

//file: PopUpColorMenu.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class PopUpColorMenu extends JFrame implements ActionListener { JPopupMenu colorMenu; Component selectedComponent; public PopUpColorMenu( ) { super("PopUpColorMenu v1.0"); setSize(100, 200); setLocation(200, 200); addWindowListener(new WindowAdapter( ) { public void windowClosing(WindowEvent e) { System.exit(0); } }); MouseListener mouseListener = new MouseAdapter( ) { public void mousePressed(MouseEvent e) { checkPopup(e); } public void mouseClicked(MouseEvent e) { checkPopup(e); } public void mouseReleased(MouseEvent e) { checkPopup(e); } private void checkPopup(MouseEvent e) { if (e.isPopupTrigger( )) { selectedComponent = e.getComponent( ); colorMenu.show(e.getComponent(), e.getX(), e.getY( ));

} } }; final Container content = getContentPane( ); content.setLayout(new FlowLayout( )); JButton button = new JButton("Uno"); button.addMouseListener(mouseListener); content.add(button); button = new JButton("Due"); button.addMouseListener(mouseListener); content.add(button); button = new JButton("Tre"); button.addMouseListener(mouseListener); content.add(button); colorMenu = new JPopupMenu("Color"); colorMenu.add(makeMenuItem("Red")); colorMenu.add(makeMenuItem("Green")); colorMenu.add(makeMenuItem("Blue")); getContentPane( ).addMouseListener(mouseListener); setVisible(true); } public void actionPerformed(ActionEvent e) { String color = e.getActionCommand( ); if (color.equals("Red")) selectedComponent.setBackground(Color.red); else if (color.equals("Green")) selectedComponent.setBackground(Color.green); else if (color.equals("Blue")) selectedComponent.setBackground(Color.blue); } private JMenuItem makeMenuItem(String label) { JMenuItem item = new JMenuItem(label); item.addActionListener( this ); return item; } public static void main(String[] args) { new PopUpColorMenu( ); } }

Debido a que el men se activa por eventos de ratn, tenemos que registrar un MouseListener por cualquiera de los componentes a los que se aplica. En este ejemplo, los tres botones y el contenido del panel de la estructura son elegibles para el color men emergente.

Por lo tanto, aadir un evento de ratn para todos los oyentes de estos elementos explcitamente. La misma instancia de un annimo interior MouseAdapter subclase se utiliza en cada caso. En esta clase, que anulan la mousePressed( ) mouse-Released( ) y mouseClicked( ) mtodos para mostrar el men cuando tenemos un evento. Cmo sabemos lo que un "caso proceda" es? Afortunadamente, no tenemos necesidad de preocuparse por los detalles de nuestro usuario de la plataforma; que slo hay que llamar al caso de la isPopupTrigger( ) mtodo. Si este mtodo true true, sabemos que el usuario ha hecho todo lo que normalmente muestra un men emergente en su sistema. Una vez que sabemos que el usuario quiere aumentar un men emergente, se muestra el men emergente llamando a su show( ) con el ratn caso de las coordenadas como argumentos. Si queramos ofrecer diferentes mens para los diferentes tipos de componentes o de los antecedentes, nos gustara crear diferentes ratn oyentes para cada tipo de componente. El ratn oyentes que invocar diferentes tipos de mens emergentes, segn proceda. Lo nico que queda es manejar los eventos de accin de los elementos del men popup. Nosotros utilizamos un mtodo llamado de ayuda makeMenuItem( ) registrar la PopUpColorMenu ventana como una accin de escucha para cada tema que aadir. El ejemplo implementa ActionListener y posee los actionPerformed( ) mtodo. Este mtodo lee el comando de accin del evento, que es igual a la opcin del men de la etiqueta por defecto. A continuacin, establece los antecedentes color de la componente seleccionado adecuadamente. La clase JScrollPane Se utiliz JScrollPane anteriormente en este captulo, sin explicar mucho acerca de ella. En esta seccin vamos a poner remedio a la situacin. Un JScrollPane un contenedor que pueden contener un componente. Dicho de otro modo, un JScrollPane envuelve otro componente. Por defecto, si el componente envuelto es ms grande que el JScrollPane s, el JScrollPane suministros barras de desplazamiento. JScrollPane los acontecimientos asas de las barras de desplazamiento y muestra la porcin apropiada de la figura componente.

Tcnicamente, JScrollPane Container un contenedor, pero es un gracioso uno. Tiene su propio gestor de diseo, que no se puede cambiar. Se pueden acomodar slo un componente a la vez. Esto parece como una gran limitacin, pero no lo es. Si usted quiere poner un montn de cosas en un JScrollPane slo hay que poner sus componentes en un JPanel con cualquier gestor de diseo que te gusta, y puesto que en el panel JScrollPane Cuando se crea un JScrollPane puede especificar las condiciones en las que sus barras de desplazamiento en pantalla. Esto se llama la barra de desplazamiento de visualizacin poltica; una poltica separada se utiliza para la horizontal y vertical de las barras de desplazamiento. Las siguientes constantes se pueden utilizar para especificar la poltica de cada una de las barras de desplazamiento: HORIZONTAL_SCROLLBAR_AS_NEEDED Muestra una barra de desplazamiento slo si el componente envuelto no encaja. HORIZONTAL_SCROLLBAR_ALWAYS Siempre muestra una barra de desplazamiento, independientemente de la figura tamao del componente. HORIZONTAL_SCROLLBAR_NEVER Nunca muestra una barra de desplazamiento, incluso si el componente de contenidos no aptos. Si utiliza esta poltica, debe proporcionar alguna otra forma de manipular el JScrollPane VERTICAL_SCROLLBAR_AS_NEEDED Muestra una barra de desplazamiento slo si el componente envuelto no encaja. VERTICAL_SCROLLBAR_ALWAYS Siempre muestra una barra de desplazamiento, independientemente de la figura tamao del componente. VERTICAL_SCROLLBAR_NEVER Nunca muestra una barra de desplazamiento, incluso si el componente de contenidos no aptos. Si utiliza esta poltica, debe proporcionar alguna otra forma de manipular el JScrollPane De forma predeterminada, HORIZONTAL_SCROLLBAR_AS_NEEDED VERTICAL_SCROLLBAR_AS_NEEDED las polticas son y

He aqu un ejemplo que utiliza un JScrollPane para mostrar una gran imagen. La propia aplicacin es muy simple, todo lo que hacemos es

colocar la imagen en una ImageComponent envuelva un JScrollPane a su alrededor, y poner el JScrollPane en un JFrame 's panel de contenido. Aqu est el cdigo:
//file: ScrollPaneFrame.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ScrollPaneFrame { public static void main(String[] args) { String filename = "Piazza di Spagna.jpg"; if (args.length > 0) filename = args[0]; JFrame f = new JFrame("ScrollPaneFrame v1.0"); f.setSize(300, 300); f.setLocation(200, 200); f.addWindowListener(new WindowAdapter( ) { public void windowClosing(WindowEvent e) { System.exit(0); } }); Image image = Toolkit.getDefaultToolkit( ).getImage(filename); f.getContentPane( ).add( new JScrollPane(new ImageComponent(image))); f.setVisible(true); } }

Y aqu est la ImageComponent Se espera para la imagen de la carga, utilizando un MediaTracker y establece su tamao al tamao de la imagen. Tambin proporciona una paint( ) mtodo para sacar la imagen. Esto tiene una nica convocatoria a drawImage( ) El primer argumento es la propia imagen; los dos prximos son las coordenadas de la imagen en relacin con el ImageComponent y el ltimo es una referencia a la ImageComponent s mismo this que sirve como imagen de un observador. (Vamos a discutir la imagen de observadores en el Captulo 18, Trabajo con imgenes y otros medios de comunicacin; por el momento, aprovechar esta en la fe.)
//file: ImageComponent.java import java.awt.*; import javax.swing.*; public class ImageComponent extends JComponent { Image image; Dimension size; public ImageComponent(Image image) {

this.image = image; MediaTracker mt = new MediaTracker(this); mt.addImage(image, 0); try { mt.waitForAll( ); } catch (InterruptedException e) { // error ... }; size = new Dimension (image.getWidth(null), image.getHeight(null)); setSize(size); } public void paint(Graphics g) { g.drawImage(image, 0, 0, this); } public Dimension getPreferredSize( ) { return size; } }

Por ltimo, ImageComponent proporciona una getPreferredSize( ) mtodo, el mtodo principal que hereda de Component Este mtodo simplemente devuelve el tamao de la imagen, que es una Dimension objeto. Cuando usted est utilizando JScrollPane es importante para el objeto que est desplazndose a proporcionar una indicacin fiable de su tamao. Figura 14-6 muestra la ScrollPaneFrame con el ImageComponent Figura 14-6. ScrollPaneFrame La aplicacin

La clase JSplitPane Un panel de divisin especial es un contenedor que tiene dos componentes, cada uno en su propia sub-panel. Un separador de la barra se ajusta a la dimensin de las dos sub-paneles. En un visor de documentos, se puede usar una fraccin de panel para mostrar una tabla de contenido junto a un documento completo.

En el ejemplo siguiente se capitaliza en la ImageComponent la clase de ejemplo anterior. Muestra dos ImageComponents envuelto en JScrollPanes en cualquiera de las partes de un JSplitPane Puede arrastrar el separador de la barra hacia adelante y hacia atrs para ajustar el tamao de los dos componentes. //file: SplitPaneFrame.java
import import import import java.awt.*; java.awt.event.*; javax.swing.*; javax.swing.border.*;

public class SplitPaneFrame { public static void main(String[] args) { String fileOne = "Piazza di Spagna.jpg"; String fileTwo = "L1-Light.jpg"; if (args.length > 0) fileOne = args[0]; if (args.length > 1) fileTwo = args[1]; // create a JFrame to hold everything JFrame f = new JFrame("SplitPaneFrame"); f.addWindowListener(new WindowAdapter( ) { public void windowClosing(WindowEvent we) { System.exit(0); } }); f.setSize(300, 200); f.setLocation(200, 200); Image leftImage = Toolkit.getDefaultToolkit( ).getImage(fileOne); Component left = new JScrollPane(new ImageComponent(leftImage)); Image rightImage = Toolkit.getDefaultToolkit( ).getImage(fileTwo); Component right = new JScrollPane(new ImageComponent(rightImage)); JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, left, right); split.setDividerLocation(100); f.getContentPane( ).add(split); f.setVisible(true); } }

Esto ejemplo se muestra en la Figura 14-7. Figura 14-7. Utilizando un panel de divisin

La clase JTabbedPane Si alguna vez has tratado con el Sistema del panel de control en Windows, usted ya sabe lo que es un JTabbedPane es. Es un recipiente con la etiqueta pestaas. Al hacer clic en una ficha, un nuevo conjunto de controles se muestra en el cuerpo de la JTabbedPane En Swing, JTabbedPane es simplemente un contenedor especializado. Cada ficha tiene un nombre. Para agregar una ficha a JTabbedPane simplemente llame addTab( ) Tendr que especificar nombre de la pestaa, as como un componente que proporciona ficha de contenido. Normalmente, se trata de un contenedor de celebracin de otros componentes. la el la la

A pesar de que la JTabbedPane slo muestra un conjunto de componentes a la vez, ser conscientes de que todos los componentes en todas las pginas estn en la memoria de una sola vez. Si usted tiene componentes que cerdo tiempo de procesador o la memoria, tratar de ponerlas en algn "sueo" del Estado cuando no se muestran. El siguiente ejemplo muestra cmo crear una JTabbedPane Aade la norma componentes Swing a una primera ficha, con el nombre Controles. La segunda ficha se rellena con una instancia de ImageComponent que se present anteriormente en este captulo.
//file: TabbedPaneFrame.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; public class TabbedPaneFrame { public static void main(String[] args) { // create a JFrame to hold everything JFrame f = new JFrame("TabbedPaneFrame"); f.addWindowListener(new WindowAdapter( ) { public void windowClosing(WindowEvent we) { System.exit(0); }

}); f.setSize(200, 200); f.setLocation(200, 200); JTabbedPane tabby = new JTabbedPane( ); // create a controls pane JPanel controls = new JPanel( ); controls.add(new JLabel("Service:")); JList list = new JList( new String[] { "Web server", "FTP server" }); list.setBorder(BorderFactory.createEtchedBorder( )); controls.add(list); controls.add(new JButton("Start")); // create an image pane String filename = "Piazza di Spagna.jpg"; Image image = Toolkit.getDefaultToolkit( ).getImage(filename); JComponent picture = new JScrollPane(new ImageComponent(image)); tabby.addTab("Controls", controls); tabby.addTab("Picture", picture); f.getContentPane( ).add(tabby); f.setVisible(true); } }

El cdigo no es especialmente elegante, pero el resultado es un aspecto impresionante interfaz de usuario. La primera ficha es un JPanel que contiene algunos otros componentes, entre ellos un JList con un grabado frontera. La segunda pestaa contiene simplemente una ImageComponent envuelto en un JScrollPane El funcionamiento ejemplo se muestra en la Figura 14-8. Figura 14-8. Uso de una panel de pestaas

Las barras de desplazamiento y deslizantes JScrollPane tal es un componente prctico que puede que no siempre es necesario utilizar las barras de desplazamiento por s mismos. De

hecho, si alguna vez no se encuentra utilizando una barra de desplazamiento por s solo, es probable que usted realmente desea utilizar otro componente llamado un control deslizante. No hay mucho sentido en la descripcin de la apariencia y la funcionalidad de las barras de desplazamiento y deslizantes. En lugar de ello, vamos a saltar en derecho con un ejemplo que incluye ambos componentes. Figura 14-9 muestra un ejemplo sencillo con una barra de desplazamiento y un control deslizante. Figura 14-9. Uso deslizante y un de una barra

Aqu est el cdigo fuente de este ejemplo:


//file: Slippery.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; public class Slippery extends JFrame { public Slippery( ) { super("Slippery v1.0"); setSize(220, 160); setLocation(200, 200); Container content = getContentPane( ); JPanel main = new JPanel(new GridLayout(2, 1)); JPanel scrollBarPanel = new JPanel( ); final JScrollBar scrollBar = new JScrollBar(JScrollBar.HORIZONTAL, 0, 48, 0, 255); int height = scrollBar.getPreferredSize( ).height; scrollBar.setPreferredSize(new Dimension(175, height)); scrollBarPanel.add(scrollBar); main.add(scrollBarPanel); JPanel sliderPanel = new JPanel( ); final JSlider slider = new JSlider(JSlider.HORIZONTAL, 0, 255, 128);

slider.setMajorTickSpacing(48); slider.setMinorTickSpacing(16); slider.setPaintTicks(true); sliderPanel.add(slider); main.add(sliderPanel); content.add(main, BorderLayout.CENTER); final JLabel statusLabel = new JLabel("Welcome to Slippery v1.0"); content.add(statusLabel, BorderLayout.SOUTH); // wire up the event handlers scrollBar.addAdjustmentListener(new AdjustmentListener( ) { public void adjustmentValueChanged(AdjustmentEvent e) { statusLabel.setText("JScrollBar's current value = " + scrollBar.getValue( )); } }); slider.addChangeListener(new ChangeListener( ) { public void stateChanged(ChangeEvent e) { statusLabel.setText("JSlider's current value = " + slider.getValue( )); } }); } public static void main(String[] args) { JFrame f = new Slippery( ); f.addWindowListener(new WindowAdapter( ) { public void windowClosing(WindowEvent e) { System.exit(0); } }); f.setVisible(true); } }

Todos los que hemos hecho realmente aqu se aade un JScrollBar y un JSlider para nuestra ventana principal. Si el usuario ajusta cualquiera de estos componentes, el valor actual del componente se muestra en un JLabel en la parte inferior de la ventana. El JScrollBar y JSlider son a la vez creado por especificar una orientacin, ya sea HORIZONTAL Tambin puede especificar los valores mnimo y mximo para los componentes, as como el valor inicial. El JScrollBar apoya un parmetro adicional, en la medida. La medida se refiere a qu rango de valores est representada por el control deslizante en la barra de desplazamiento. Por ejemplo, en una barra de desplazamiento que va de 0 a 255, una medida de 128

significa que el regulador ser la mitad de la anchura de la zona desplegable de la barra de desplazamiento. JSlider apoya la idea de marcas, que son las lneas que determinados valores a lo largo de la longitud del deslizador. Grandes marcas son ligeramente ms grandes que pequeas marcas. Para dibujar marcas, slo especificar un intervalo para mayores y menores marcas y, a continuacin, pintar las marcas:
slider.setMajorTickSpacing(48); slider.setMinorTickSpacing(16); slider.setPaintTicks(true);

JSlider tambin apoya el etiquetado de las garrapatas con cadenas de texto, utilizando el setLabel-Table( ) mtodo. En respuesta a los acontecimientos de los dos componentes es sencillo. El JScrollBar enva AdjustmentEvent s cada vez que algo sucede, el JSlider incendios fuera ChangeEvent s cuando su valor cambia. En nuestro simple ejemplo, podemos mostrar el nuevo valor del componente cambi en el JLabel en la parte inferior de la ventana. Dilogos Un cuadro de dilogo es otra caracterstica estndar de interfaces de usuario. Dilogos con frecuencia son utilizados para presentar la informacin al usuario ( "Su ensalada de frutas est listo.") O hacer una pregunta ( "Voy a traer el coche aqu?"). Dilogos se utilizan de manera comn en aplicaciones GUI de Swing que incluye un prctico conjunto de pre-construidos dilogos. Estos son accesibles desde los mtodos estticos en el JOptionPane clase. Muchas variaciones son posibles; JOptionPane grupos en cuatro tipos bsicos: mensaje de dilogo Muestra un mensaje para el usuario, por lo general acompaado por un botn Aceptar. de dilogo de confirmacin Haga una pregunta y respuesta botones de muestra, generalmente S, No, y Cancelar. de dilogo de entrada Pide al usuario que escriba una cadena. opcin de los cuadros de dilogo La mayora de tipo general - que pasa a tu gusto componentes, que se muestran en el cuadro de dilogo.

Un dilogo de confirmacin se muestra en la Figura 14-10. Figura 14-10. Uso de un dilogo de confirmacin

Veamos ejemplos de cada tipo de dilogo. produce un mensaje de dilogo:

El siguiente cdigo

JOptionPane.showMessageDialog(f, "You have mail."); El primer parmetro a showMessageDialog( ) es el componente de los padres (en este caso, f un JFrame El dilogo se centrar en el componente de los padres. Si usted pasa null para la matriz de componentes, el cuadro de dilogo se centra en la pantalla. Los cuadros de dilogo que JOptionPane se muestra modal, lo que significa que otro bloque de entrada a su solicitud mientras que se muestran. Aqu est un poco ms elegante de dilogo con el mensaje. Hemos especificado un ttulo para el cuadro de dilogo y un tipo de mensaje, que afecta el icono que se muestra: JOptionPane.showMessageDialog(f, "You are low on memory.", "Apocalyptic message", JOptionPane.WARNING_MESSAGE); A continuacin le indicamos cmo mostrar el cuadro de dilogo de confirmacin se muestra en la Figura 14-10: int result = JOptionPane.showConfirmDialog(null, "Do you want to remove Windows now?"); En este caso, hemos superado null para el componente de padres. Especial valores son devueltos a partir showConfirmDialog( ) indicar que se presion el botn. Hay completo ejemplo de abajo que muestra cmo utilizar este valor retorno. los de un de

A veces es necesario pedir al usuario que escriba algunos insumos. El siguiente cdigo pone un cuadro de dilogo solicitando el nombre del usuario:

String name = JOptionPane.showInputDialog(null, "Please enter your name."); Sea cual sea el tipo de usuario es devuelto String una cadena, o null el usuario pulsa el botn Cancelar. La mayora de tipo general de dilogo es la opcin de dilogo. Usted suministro de una serie de objetos que desea que se muestre; JOptionPane se encarga de formatear y mostrar el cuadro de dilogo. El siguiente ejemplo muestra una etiqueta de texto, un JTextField y un JPasswordField (Texto componentes se describen en el siguiente captulo.)
JTextField userField = new JTextField( ); JPasswordField passField = new JPasswordField( ); String message = "Please enter your user name and password."; result = JOptionPane.showOptionDialog(f, new Object[] { message, userField, passField }, "Login", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null);

Tambin hemos especificado un cuadro de dilogo ttulo ( "Login") en la convocatoria a showOptionDialog( ) Queremos Aceptar y Cancelar botones, de modo que pase OK_CANCEL_OPTION como el tipo de dilogo. El QUESTION_MESSAGE argumento indica que nos gustara ver el icono de interrogacin. Los tres ltimos elementos son opcionales: un Icon una serie de diferentes opciones, y una seleccin actual. Desde el icono parmetro es null por defecto se usa. Si el conjunto de opciones y la seleccin actual no son parmetros null JOptionPane podra tratar de mostrar las opciones en una lista o cuadro combinado. La siguiente aplicacin incluye todos los ejemplos que hemos cubierto:
import javax.swing.*; public class ExerciseOptions { public static void main(String[] args) { JFrame f = new JFrame("ExerciseOptions v1.0"); f.setSize(200, 200); f.setLocation(200, 200); f.setVisible(true); JOptionPane.showMessageDialog(f, "You have mail."); JOptionPane.showMessageDialog(f, "You are low on memory.",

"Apocalyptic message", JOptionPane.WARNING_MESSAGE); int result = JOptionPane.showConfirmDialog(null, "Do you want to remove Windows now?"); switch (result) { case JOptionPane.YES_OPTION: System.out.println("Yes"); break; case JOptionPane.NO_OPTION: System.out.println("No"); break; case JOptionPane.CANCEL_OPTION: System.out.println("Cancel"); break; case JOptionPane.CLOSED_OPTION: System.out.println("Closed"); break; } String name = JOptionPane.showInputDialog(null, "Please enter your name."); System.out.println(name); JTextField userField = new JTextField( ); JPasswordField passField = new JPasswordField( ); String message = "Please enter your user name and password."; result = JOptionPane.showOptionDialog(f, new Object[] { message, userField, passField }, "Login", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null); if (result == JOptionPane.OK_OPTION) System.out.println(userField.getText( ) + " " + new String(passField.getPassword( ))); System.exit(0); } }

Dilogo de seleccin de archivos A JFileChooser es un archivo estndar de seleccin de la casilla. Al igual que con otros componentes Swing, JFileChooser se lleva a cabo en Java puro, por lo que se ve y acta de la misma en diferentes plataformas. Seleccin de archivos de todo el da puede ser muy aburrido, sin un propsito mayor, por lo que vamos a ejercer el JFileChooser en un mini-editor de la aplicacin. Editor ofrece un rea de texto en el que podemos cargar y trabajar con archivos. (El JFileChooser creado por Editor se muestra en la Figura 14-11). Dejaremos slo tmido de la capacidad de guardar y dejar de rellenar los espacios en blanco (con algunas salvedades):

Figura 14-11. Uso de una JFileChooser

import java.awt.*; import java.awt.event.*; import java.io.*; import javax.swing.*; public class Editor extends JFrame implements ActionListener { public static void main(String[] s) { new Editor( ); } private JEditorPane textPane = new JEditorPane( ); public Editor( ) { super("Editor v1.0"); addWindowListener(new WindowAdapter( ) { public void windowClosing(WindowEvent e) { System.exit(0); } }); Container content = getContentPane( ); content.add(new JScrollPane(textPane), BorderLayout.CENTER); JMenu menu = new JMenu("File"); menu.add(makeMenuItem("Open")); menu.add(makeMenuItem("Save")); menu.add(makeMenuItem("Quit")); JMenuBar menuBar = new JMenuBar( ); menuBar.add(menu); setJMenuBar(menuBar); setSize(300, 300); setLocation(200, 200); setVisible(true); } public void actionPerformed(ActionEvent e) { String command = e.getActionCommand( ); if (command.equals("Quit")) System.exit(0); else if (command.equals("Open")) loadFile( ); else if (command.equals("Save")) saveFile( ); } private void loadFile ( ) { JFileChooser chooser = new JFileChooser( );

int result = chooser.showOpenDialog(this); if (result == JFileChooser.CANCEL_OPTION) return; try { File file = chooser.getSelectedFile( ); java.net.URL url = file.toURL( ); textPane.setPage(url); } catch (Exception e) { textPane.setText("Could not load file: " + e); } } private void saveFile( ) { JFileChooser chooser = new JFileChooser( ); chooser.showSaveDialog(this); // Save file data... } private JMenuItem makeMenuItem( String name ) { JMenuItem m = new JMenuItem( name ); m.addActionListener( this ); return m; } }

Editor es un JFrame que se establece con un JEditorPane (que se tratarn en el prximo captulo) y un men desplegable. Desde el men desplegable men Archivo, podemos Abrir, Guardar, o Salir. El actionPerformed( ) mtodo de las capturas de los acontecimientos relacionados con estas selecciones de men y toma las medidas pertinentes. Lo interesante de Editor son los private los mtodos loadFile( ) saveFile( ) loadFile( ) crea un nuevo JFileChooser y pide su showOpenDialog( ) mtodo. A JFileChooser hace su trabajo cuando el showOpenDialog( ) se llama mtodo. Este mtodo bloques de la persona que llama el cuadro de dilogo hasta que concluya su trabajo, momento en que el selector de archivo desaparece. Despus de eso, podemos recuperar el archivo designados con el getFile( ) mtodo. En loadFile( ) que convertir File archivo seleccionado a una URL y pasar a la JEditorPane que muestra el archivo seleccionado. Como usted aprender en el prximo captulo, JEditorPane puede mostrar HTML y archivos RTF. Usted puede llenar la inconclusa saveFile( ) mtodo si lo desea, pero sera prudente agregar a la norma de seguridad. Por ejemplo, podra usar uno de los cuadros de dilogo de confirmacin que acabamos de

examinar pregunte al usuario antes de sobrescribir un archivo existente. El selector de color Swing es cua llena de golosinas. JColorChooser es otro listo de dilogo hecha con Swing, que permite a sus usuarios a elegir los colores. El siguiente ejemplo muy breve muestra de lo fcil que es utilizar JColorChooser
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class LocalColor { public static void main(String[] args) { final JFrame f = new JFrame("LocalColor v1.0"); f.addWindowListener(new WindowAdapter( ) { public void windowClosing(WindowEvent e) { System.exit(0); } }); f.setSize(200, 200); f.setLocation(200, 200); final Container content = f.getContentPane( ); content.setLayout(new GridBagLayout( )); JButton button = new JButton("Change color..."); content.add(button); button.addActionListener(new ActionListener( ) { public void actionPerformed(ActionEvent e) { Color c = JColorChooser.showDialog(f, "Choose a color", content.getBackground( )); if (c != null) content.setBackground(c); } }); f.setVisible(true); } }

Este ejemplo muestra una ventana de marco con un solo botn. Al hacer clic en el botn, un selector de color aparece. Despus de seleccionar un color, se convierte en el color de fondo de la ventana de marco. Bsicamente todo lo que tenemos que hacer es llamar a JColorChooser 's mtodo showDialog( ) En este ejemplo, hemos especificado una matriz de componentes, ttulo de un cuadro de dilogo, y un valor de color inicial. Sin embargo, puede apaarse con

tan slo especificar un componente de los padres. Sea cual sea el color que el usuario elige es devuelto, si el usuario pulsa el botn null null se devuelve. 2.5 ADMINISTRACION DEL DISEO: LAYOUT MANAGER LAYAOUT Ya ha llegado casi el momento de empezar a aadir cosas a nuestra ventana, slo una cosa queda pendiente: como controlar dnde aadimos los objetos. Por jemplo como decirle a nuestro panel dnde tiene que colocar un botn, por ejemplo. Una solucin sera indicarle dnde colocar la esquina izquierda de arriba del botn y luego indicando el alto y ancho del botn. Esto es precisamente lo que hace el mtodo setBounds(int,int,int,int) de la clase Component. Parece, en principio, una buena solucin.
import javax.swing.*; import java.awt.event.*; import java.awt.*; class Frame extends JFrame { public Frame(){ setTitle("Hola!!!"); setSize(500,400); addWindowListener (new manejador()); Container contentpane = getContentPane(); JPanel panel = new JPanel(); //Elimino el gestor de layouts del panel panel.setLayout(null); //Creo un objeto de tipo JButton (un botn) JButton boton = new JButton(); //Mediante este mtodo le indico al botn que se site en las //coordenadas 300,300 del panel, con un tamao de 50x50 boton.setBounds(300,300,50,50); //Aado el botn al panel panel.add(boton); contentpane.add(panel); panel.setBackground(Color.red); } } class manejador extends WindowAdapter{ public void windowClosing(WindowEvent e){ System.out.println("sali"); System.exit(0); } } public class Ejemplo18{ public static void main (String[] args){ JFrame frame = new Frame(); frame.show();

} } ///:~

Si con este cdigo probamos a cambiar de tamao la ventana podremos ver como el botn no se mueve, desapareciendo si la ventana se hace muy pequea y cambiando su posicin relativa a los bordes de la ventana. Esto, en una aplicacin real, desorientara al usuario que nunca sabra dnde irlo a buscar al cambiar el tamao de la ventana. Para solucionar este inconveniente se crearon los Layout Maneger: con ellos se especifican unas posiciones determinadas en un panel, frame o applet donde aadiremos nuestros componentes o un nuevo panel, al que tambin le podremos aadir un layout en cuyas posiciones podremos aadir componentes o ms panels con layouts.... La posibilidad de aadir varios panels a un layout y fijar a estos nuevos layouts da un gran dinamismo a la hora de colocar los componentes. FlowLayout Es el que tienen los paneles por defecto. Los objetos se van colocando en filas en el mismo orden en que se aadieron al contenedor. Cuando se llena una fila se pasa a la siguiente. Tiene tres posibles constructores: FlowLayout(); Crea el layout sin aadirle los componentes, con los bordes de unos pegados a otros. FlowLayout(FlowLayout.LEFT[RIGTH][CENTER]); Indica la alineacin de los componentes: a la izquierda, derecha o centro. FlowLayout(FlowLayout.LEFT, gap_horizontal, gap_vertical); Adems de la alineacin de los componentes indica un espaciado (gap) entre los distintos componentes, de tal modo que no aparecen unos pegados a otros. He aqu un ejemplo del uso de FlowLayout:
import javax.swing.*; import java.awt.*; class panel extends JFrame{ public panel() { setSize(300,200); Container container = this.getContentPane(); FlowLayout fl = new FlowLayout(FlowLayout.LEFT, 5, 10); container.setLayout(fl); for (int i=0; i<4; i++) {

JButton button = new JButton("Button"+(i+1)); button.setPreferredSize(new Dimension(100,25)); container.add(button); } } } public class Ejemplo19{ public static void main (String[] args){ panel t = new panel(); t.show(); } } ///:~

GridLayout Como su propio nombre indica crea un grid (malla) y va aadiendo los componentes a las cuadrculas de la malla de izquierda a derecha y de arriba abajo. Todas las cuadrculas sern del mismo tamao y crecern o se harn ms pequeas hasta ocupar toda el rea del contenedor. Hay dos posibles constructores: GridLayout(int filas, int columnas); Crear un layout en forma de malla con un nmero de columnas y filas igual al especificado. GridLayout(int columnas, int filas, int gap_horizontal, int gat_vertical); Especifica espaciados verticales y horizontales entre las cuadrculas. El espaciado se mide en pxeles. Veamos un ejemplo:
import javax.swing.*; import java.awt.event.*; import java.awt.*; class panel extends JFrame { Container container = null; public panel() { setSize(350,150); container = this.getContentPane(); GridLayout grid = new GridLayout(3,2, 5,5); // filas = 3, columnas = 2, horizontal gap =5, //vertical gap = 5 container.setLayout(grid); for (int i=0; i<6; i++) container.add(new JButton("Button"+(i+1))); } } public class Ejemplo20{ public static void main (String[] args){ panel t = new panel(); t.show(); } } ///:~

BorderLayout Este layout tiene cinco zonas predeterminadas: son norte (NORTH), sur (SOUTH), este(EAST), este (WEST) y centro(CENTER). Las zonas norte y sur al cambiar el tamao del contenedor se estirarn hacia los lados para llegar a ocupar toda el rea disponible, pero sin variar su tamao en la direccin vertical. Las zonas este y oeste presentan el comportamiento contrario: variarn su tamao en la direccin vertical pero sin nunca variarlo en la direccin horizontal. En cuanto a la zona central crecer o disminuir en todas las direcciones para rellenar todo el espacio vertical y horizontal que queda entre las zonas norte, sur, este y oeste. Posee dos contructores: BorderLayout(); que crear el layout sin ms y BordreLayout(int gap_horizontal, int gap_vertical); Crear el layout dejando los gaps horizontales y verticales entre sus distintas zonas. A la hora de aadir ms paneles o componentes a este Layout hay una pequea diferencia respecto a los otros dos: en los otros bamos aadiendo componentes y el los iba situando en un determinado orden, aqu especificamos en el mtodo add la regin donde queremos aadir el componente: panel.add(componente_a_aadir, BorderLayout.NORTH); borderlayout Con esta llamada al mtodo add aadiremos el componente en la rea norte. Cambiando NORTH por SOUTH, EAST, WEST, CENTER lo aadiremos en la regin correspondiente. Veamos un ejemplo:
import java.awt.*; import javax.swing.*; class panel extends JFrame { public panel() { setSize(400,250); Container container = this.getContentPane(); container.setLayout(new BorderLayout(2,2)); // ((BorderLayout) container.getLayout()).setHgap(2); //((BorderLayout) container.getLayout()).setVgap(2); String[] borderConsts = { BorderLayout.NORTH, BorderLayout.SOUTH, BorderLayout.EAST, BorderLayout.WEST, BorderLayout.CENTER }; String[] buttonNames = { "North Button", "South Button", "East Button", "West Button",

"Center Button" }; for (int i=0; i<borderConsts.length; i++) { JButton button = new JButton(buttonNames[i]); container.add(button, borderConsts[i]); } } } public class Ejemplo21{ public static void main (String[] args){ panel t = new panel(); t.show(); } } ///:~

GroupLayout El nuevo layout en la version 6 del JDK, se denomina GroupLayout y bsicamente se centra en la creacin anidada de grupos de componentes tanto horizontal (createSquentialGroup()) como verticalmente (createParallelGroup()), pudiendose aadir tanto grupos de componentes como componentes solamente. Se pude por ejemplo entre las muchas facilidades que permite fijar un espaciado automtico entre conponentes con setAutoCreateGaps(true) as como tambin establecer espaciado automtico con respecto al contenedor (setAutoCreateContainerGaps()). Aqu un pantallazo de un pequeo programa de demostracin (editandose en JEdit):

En definitiva es una joya de layout manager por sus prestaciones, pero en s lo que ms me ha atrado es saber que es el layout que utliza el constructor de interfaces grficas de NetBeans5.5 con lo cul Netbeans ha terminado convencindome de nuevo, pues anteriormente usaba un layout propio denominado SwingLayout que no era estndar del JDK sino que se adjuintaba como un jar a las aplicaciones que se generaban, pero como era de suponerse, y ya que las cosas que crea la gente de netbeans son siempre interesantes, ste que anteriormente se denominaba SwingLayout fue includo en el JDK6 bajo el nombre de GroupLayout. As que ahora los hard code ya cuentan con un layout para escribir manualmente

cdigo de interfaces grficas que se conseguiran desarrolando visulamente con un IDE como NetBeans. Aqu la corrida de la aplicacin.

2.6 DIBUJAR SOBRE COMPONENTES SWING DIBUJAR EN UNA VENTANA En este apartado vamos a ver como dibujar sobre una ventana. Esto puede sernos til tanto para mostrar resultados de un modo grfico al usuario o para realizar animaciones que ilustren nuestras pginas web (una sorprendente demostracin de las capacidades grficas de java en animaciones la podemos encontrar en http://www.anfyteam.com/, pgina mantenida por una empresa cuyos programadores han recibido numerosos premios por sus desarrollos en java). Si recordamos lo que ya se coment al principio del tema, los componentes Swing estn dibujados sobre una ventana que le pedimos al sistema operativo, se puede decir que son de la mquina virtual Java y no del sistema operativo. Esto no ocurra as con los componentes de la librera AWT, en la cual los componentes eran del S.O.. Comentamos al principio de este tema que una de las ventajas de este hecho es un mayor control sobre la apariencia de estos componentes. Bien, aqu vamos a poder comprobar eso. Si estuvisemos programando con las antiguas libreras AWT slo hay un componente sobre el cual podemos dibujar: Canvas. Es el nico objeto que el S.O. nos proporciona en el que podemos dibujar. Esto quiere decir, por ejemplo, que si no nos gusta la apariencia de un scroll o de un botn no podemos hacer nada para modificarla, hemos de aceptarla tal y como se nos da. Por este motivo una misma aplicacin se vea diferente en los diferentes S.O., un scroll de Windows no tiene por que ser igual que un scroll de Linux o Mac. En las nuevas libreras Swing es posible hacer que una misma aplicacin se vea igual en todos los S.O., mediante una caracterstica de los componentes que se llama Look and Feel. Por otra parte en las

libreras Swing es posible pintar sobre cualquier componente que derive de JComponent, es posible por lo tanto modificar la apariencia de un botn o scroll a nuestro antojo (al margen de los distintos Looks and Feel disponibles. De todas formas no es una buena prctica de programacin pintar sobre cualquier componente En la documentacin de Java se aconseja que si queremos mostrar al usuario un dibujo se aconseja que lo hagamos siempre sobre un JPanel. Empezando a dibujar A continuacin vamos a ver qu tenemos que hacer para dibujar en Swing. Lo primero es hacerse con el objeto grfico del componente sobre el cual queremos dibujar. El objeto grfico es un objeto que posee toda la informacin que un componente necesita para dibujarse en pantalla. Para obtener el objeto grfico empleamos el mtodo getGraphics(), de JComponent. Graphics g = Componente.getGraphics() Una vez obtenido dicho objeto grfico procedemos a dibujar empleando los mtodos que dicho objeto nos proporciona. Estos mtodos son tan intuitivos como numerosos, por lo que no haremos aqu una revisin de ellos. Si deseamos dibujar algo lo que ms normal es acudir a la documentacin de las librera y buscar en ella los mtodos que necesitemos. A modo de ejemplo, si queremos dibujar una lnea y vamos a la documentacin de la clase Graphics encontraremos un mtodo drawLine(int x1, int x2, int x3 int x4) en el cual (x1, x2) es el punto de inicio de la lnea y (x3, x4) el fin de la lnea. Veamos un ejemplo de esto.
import java.awt.event.*; import javax.swing.*; import java.awt.*; public class Dibujar1 extends JFrame implements ActionListener{ public Dibujar1(){ setSize(400,400); setTitle("Dibujo"); Container contentpane = this.getContentPane(); contentpane.setLayout (new BorderLayout()); JPanel p =new JPanel(); contentpane.add(p, BorderLayout.SOUTH); JButton boton = new JButton("Dibujar"); boton.addActionListener(this); //Hago que el actioncommand del botn de dibujar sea //Dibujar boton.setActionCommand("Dibujar"); p.add(boton); JButton boton2 = new JButton("Salir"); boton2.addActionListener(this);

//Hago que el actioncommand del botn para salir sea Salir boton2.setActionCommand("Salir"); p.add(boton2); contentpane.add(panel, BorderLayout.CENTER); this.setVisible(true); } public void actionPerformed(ActionEvent e){ //Obtengo el actioncommand de el objeto que produjo el evento String comando = e.getActionCommand(); //Si es salir , terminamos la mquina virtual if(comando.equals("Salir")){ System.exit(0); } //Si no le pedimos al panel el objeto Grafico Graphics g = panel.getGraphics(); //Pintaremos en color azul g.setColor(Color.blue); //Dibujamos una lnea d las coordenados (0,0) a (100,100) g.drawLine(0,0, 100, 100); //Dibujamos otra lnea desde las cooredenadas (150,150) hasta //la esquina inferior izquierda del panel g.drawLine(150,150,(int)(this.getSize()).getWidth(), (int)(this.getSize()).getHeight()); //Dibujo un rectngulo g.drawRect(100, 80, 200, 200); //Cambio de color a rojo g.setColor(Color.red); //Dibujo otro rectngulo, esta vez relleno g.fillRect(110, 90, 150, 150); } JPanel panel = new JPanel(); public void main(String[] args){ new Dibujar1(); } } ///:~

Potrebbero piacerti anche