AWT y Swing Entorno gráfico:AWT y Swing Tema 13. AWT y Swing •Su presentación visual es independiente de la plataforma en que se ejecute el applet o la aplicación 1 Tema 13. AWT y Swing 2 Soporte Java para el desarrollo de interface gráfica AWT y Swing •. Swing simplemente extiende el AWT añadiendo un conjunto de componentes, JComponents, y sus clases de soporte. Swing •Hay un conjunto de componentes de Swing que son análogos a los de AWT, y algunos de ellos participan de la arquitectura MVC (Modelo-VistaControlador), aunque Swing también proporciona cosas nuevas como árboles, pestañas, etc. Tema 13. AWT y Swing Se trata de bibliotecaS de clases Java para el desarrollo de Interfaces de Usuario Gráficas. AWT Swing utiliza el modelo de eventos basado en delegación de AWT (definido a partir de Java 1.1) Soporte nativo para GUIs 3 AWT y Swing Tema 13. AWT y Swing 4 AWT y Swing La estructura básica del AWT se basa en Componentes y Contenedores. Estos últimos contienen Componentes posicionados a su respecto y son Componentes a su vez, de forma que los eventos pueden tratarse tanto en Contenedores como en Componentes. El diseño de toda interfaz conlleva: Decidir la estructura de la interfaz •Qué componentes gráficos se van a utilizar, y cómo se van a relacionar estos componentes) Decidir la disposición (layout) de los componentes •sirven para organizar los componentes contenidos en los mismos. Decidir el comportamiento de la interfaz: gestión de eventos •Algunos componentes son controles: permiten reaccionar ante eventos del usuario. El comportamiento se especifica programando las respuestas a dichos eventos. Tema 13. AWT y Swing 5 Tema 13. AWT y Swing 6 1 AWT Y Swing AWT Y Swing Todavía no hay herramientas de composición visual, corriendo por cuenta del programador el encaje de todas las piezas, así como la seguridad de tratamiento de los eventos adecuados. •Los Contenedores contienen Componentes, que son los controles básicos •No se usan posiciones fijas de los Componentes, sino que están situados a través de una disposición controlada (layouts) Con Swing se va un paso más allá, ya que todos los JComponentes son subclases de Container, lo que hace posible que componentes de Swing puedan contener otros componentes, Tema 13. AWT y Swing •Es bastante dependiente de la máquina en que se ejecuta la aplicación (no puede asumir que un diálogo tendrá el mismo tamaño en cada máquina) 7 Componentes Tema 13. AWT y Swing Contenedores •Un interfaz gráfico está construida en base a elementos gráficos básicos, los Componentes. Típicos ejemplos de estos Componentes son los botones, barras de desplazamiento, etiquetas, listas, cajas de selección o campos de texto. •Los Componentes se agrupan dentro de Contenedores. •Los Contenedores contienen y organizan la situación de los Componentes; además, los Contenedores son en sí mismos Componentes y como tales pueden ser situados dentro de otros Contenedores. •Los Componentes permiten al usuario interactuar con la aplicación y proporcionar información desde el programa al usuario sobre el estado del programa. En el AWT, todos los Componentes son instancias de la clase Component. Tema 13. AWT y Swing •También contienen el código necesario para el control de eventos. •En el AWT, todos los Contenedores son instancias de la clase Container 9 Containers de Swing Tema 13. AWT y Swing 10 Jerarquía Object Object Component Component Graphics java.awt getGraphics() Container Container javax.swing JComponent Box Panel 8 Window JAbstractButton Applet Frame Dialog JApplet JFrame JDialog JWindow yourFrame yourDialog yourWindow JButton JList JMenuItem JPanel JTextComponent JTextField JLabel JTextArea getContentPane() yourApplet Tema 13. AWT y Swing 11 Tema 13. AWT y Swing 12 2 Componentes Componentes Hay Componentes con entrada de tipo notextual como: Hay Componentes con entrada de tipo textual como: •los botones de pulsación: Button •campos de texto: TextField •las listas: List •las áreas de texto TextArea •botones de marcación: Checkbox •las etiquetas:Label •botones de selección: Choice Y otros Componentes como: •botones de comprobación: CheckboxGroup las barras de desplazamiento: Scrollbar Tema 13. AWT y Swing zonas de dibujo: Canvas 13 Tema 13. AWT y Swing 14 Mostrando el Contenedor en el Frame Componentes Incluso los Contenedores Ejemplo en un contenedor Frame: Panel public class Proy_Frame extends Frame { Button apilaBoton =new Button("Apila"); Window Dialog En su contructor: Frame apilaBoton.setBounds(10,100,100,40); también pueden considerarse como Componentes. add(apilaBoton); Tema 13. AWT y Swing 15 Mostrando el Contenedor en el Frame El contenedor mostrará el boton: public static void main(String[] args) { Proy_Frame frame = new Proyecto_FrameFrame(); frame.setVisible(true); 16 Campos de Texto Para la entrada directa de datos se suelen utilizar los campos de texto, que aparecen en pantalla como pequeñas cajas que permiten al usuario la entrada por teclado de una línea de caracteres. La clase TextField extiende a la clase TextComponent, que extiende a su vez, a la clase Component. } Tema 13. AWT y Swing Tema 13. AWT y Swing 17 Tema 13. AWT y Swing 18 3 Areas de Texto Areas de Texto Un área de texto (TextArea) es una zona multilínea que permite la presentación de texto, que puede ser editable o de sólo lectura. TextArea miAreaTexto = new TextArea( "",5,20,TextArea.SCROLLBARS_VERTICAL_O NLY ); Al igual que la clase TextField, esta clase extiende la clase TextComponent for( int i=0; i < 10; i++ ) miAreaTexto.append( "linea "+i+"\n" ); Tema 13. AWT y Swing 19 Etiquetas de Texto Tema 13. AWT y Swing 20 Button Una etiqueta (Label) proporciona una forma de colocar texto estático en un panel, para mostrar información al usuario. La clase Button dispone de todos los métodos heredados de las clases Component y Object, y: La clase Label extiende la clase Component •addActionListener() Añade un receptor de eventos de tipo Action •getLabel()Devuelve la etiqueta o título del botón •removeActionListener()Elimina el receptor de eventos para que el botón deje de realizar acción alguna Tema 13. AWT y Swing 21 Eventos Java es, por diseño, un lenguaje multiproceso: en un programa Java pueden existir (y de hecho existen) simultáneamente múltiples hilos de ejecución (threads) concurrentes Uno de estos hilos es el hilo de tratamiento de eventos En las aplicaciones con GUI, el hilo principal se limita a construir la estructura de la GUI, a asociar los oyentes adecuados … pero la aplicación en sí no termina, puesto que todavía queda, al menos, un hilo con vida: el de tratamientoTema de13.eventos AWT y Swing 23 •setLabel()Fija el título o etiqueta visual del botón Tema 13. AWT y Swing 22 Eventos de Button Para añadir el código a ejecutar cuando se pulse el botón (en el constructor de su contenedor): apilaBoton.addActionListener ( new ActionListener() { public void actionPerformed(ActionEvent e){ ... } } ); Tema 13. AWT y Swing 24 4 Choice Choice Los botones de selección (Choice) permiten el rápido acceso a una lista de elementos, presentándose como título el item que se encuentre seleccionado. class MiActionListener implements ActionListener { // Se sobrescribe el método actionPerformed() del interfaz ActionListener La clase Choice extiende la clase Component e implementa el interfaz ItemSelectable, que es el interfaz que mantiene un conjunto de items en los que puede haber, o no, alguno seleccionado. void actionPerformed( ActionEvent evt ) { ... } Además, esta clase proporciona el método addItemListener(), Tema 13. AWT y Swing 25 Canvas Tema 13. AWT y Swing 26 Canvas Una zona de dibujo, o lienzo (Canvas), es una zona rectangular vacía de la pantalla sobre la cual una aplicación puede pintar, o desde la cual una aplicación puede recuperar eventos producidos por acciones del usuario. canvas es útil a la hora de presentar imágenes o gráficos en pantallaCuando se implementa una subclase de la clase Canvas hay que prestar atención en implementar los métodos minimumSize() y preferredSize() para reflejar adecuadamente el tamaño de canvas; porque dependiendo del layout que utilice el contenedor del canvas, el canvas puede llegar a ser demasiado pequeño, incluso invisible. La clase Canvas es muy simple, consiste en un solo constructor sin argumentos y dos métodos, que son: AddNotify()Crea el observador del canvas paint( Graphics )Repinta el canvas Tema 13. AWT y Swing 27 Barra de Desplazamiento 28 Menus Las barras de desplazamiento (Scrollbar) se utilizan para permitir realizar ajustes de valores lineales en pantalla, porporcionan una forma de trabajar con rangos de valores o de áreas Tema 13. AWT y Swing Tema 13. AWT y Swing 29 MenuComponent, es la superclase de todos los Componentes relacionados con menús. MenuItem, representa una opción en un menú. Menu, es un Componente de una barra de menú. MenuBar, encapsula el concepto de una barra de menú en un Frame. CheckboxMenuItem, genera una caja de selección que representa una opción en un Tema 13. AWT y Swing 30 menú. 5 Menus JFrame MenuComponent, es la superclase de todos los Componentes relacionados con menús. MenuItem, representa una opción en un menú. Menu, es un Componente de una barra de menú. MenuBar, encapsula el concepto de una barra de menú en un Frame. CheckboxMenuItem, genera una caja de selección que representa una opción en un menú. Toda aplicación Swing tiene, al menos, un contenedor raíz (una ventana) JFrame incluye una serie de elementos: • • .... Tema 13. AWT y Swing 31 Los contenidos se añaden en el panel de contenidos (content pane) accesible a través del método getContentPane (por defecto, un objeto de tipo Jpane, aunque puede cambiarse con setContentPane). La barra de menú puede fijarse con setJMenuBar Tema 13. AWT y Swing ContentPane 32 JFrame JFrame import java.awt.*; import java.awt.event.*; import javax.swing.*; private static void createAndShowGUI() { JFrame.setDefaultLookAndFeelDecorated(true); Content Pane JFrame frame = new JFrame("FrameDemo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JLabel emptyLabel = new JLabel(""); emptyLabel.setPreferredSize(new Dimension(175, 100)); frame.getContentPane().add(emptyLabel,BorderLayout.CENTER); frame.pack(); frame.setVisible(true); } Añadir componentes public static void main(String[] args) { frame.getContentPane().add( new JPanel(),BorderLayout.CENTER ); Tema 13. AWT y Swing 33 JFrame createAndShowGUI(); }});}} Tema 13. AWT y Swing 34 Hola Mundo setSize setCursor javax.swing.SwingUtilities.invokeLater(new Runnable() {public void run() { JFrame setTitle setVisible Tema 13. AWT y Swing 35 import javax.swing.*; public class HelloWorldSwing { private static void createAndShowGUI() { JFrame.setDefaultLookAndFeelDecorated(true); JFrame frame = new JFrame("HelloWorldSwing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JLabel label = new JLabel("Hello World"); frame.getContentPane().add(label); frame.pack(); frame.setVisible(true); } public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); }} Tema 13. AWT y Swing 36 6 Posicionamiento Absoluto Layout Los Componentes se pueden colocar en Contenedores utilizando cualquiera de los Layouts, más seguros ante cambios de resolución, o utilizando posicionamiento absoluto. La clase Component proporciona métodos para especificar la posición y tamaño de un Componente en coordenadas absolutas indicadas en pixels: setBounds( int,int,int,int ); setBounds( Rectangle ); Los layout ayudan a adaptar los diversos Componentes que se desean incorporar a un Panel, es decir, especifican la apariencia que tendrán los Componentes a la hora de colocarlos sobre un Contenedor, controlando tamaño y posición (layout) automáticamente. miBoton.setBounds( new Rectangle( 25,20,100,75 ) ); Tema 13. AWT y Swing 37 Layout Tema 13. AWT y Swing 38 Tema 13. AWT y Swing 40 Layout En el tratamiento de los Layouts se utiliza un método de validación, de forma que los Componentes son marcados como no válidos cuando un cambio de estado afecta a la geometría o cuando el Contenedor tiene un hijo incorporado o eliminado. La validación se realiza automáticamente cuando se llama a pack() o show(). Tema 13. AWT y Swing 39 FlowLayout FlowLayout Es el más simple y el que se utiliza por defecto en todos los Paneles si no se fuerza el uso de alguno de los otros. Los Componentes añadidos a un Panel con FlowLayout se encadenan en forma de lista, de izquierda a derecha, y se puede seleccionar el espaciado entre cada Componente. Tema 13. AWT y Swing 41 FlowLayout miFlowLayout = new FlowLayout( FlowLayout.CENTER,3,3 ); miFrame.setLayout( miFlowLayout ); Button boton1 = new Button( "Primero" ); ... miFrame.add( boton1 ); .... Tema 13. AWT y Swing 42 7 BorderLayout BorderLayout //En el constructor de un Frame La composición BorderLayout (de borde) proporciona un esquema más complejo de colocación de los Componentes en un panel. La composición utiliza cinco zonas para colocar los Componentes sobre ellas: Norte, Sur, Este, Oeste y Centro. Es el layout o composición que se utilizan por defecto Frame y Dialog. Tema 13. AWT y Swing 43 BorderLayout BorderLayout miLayout = new BorderLayout(); miLayout.setVgap( 30 ); miLayout.setHgap( 30 ); this.setLayout( miLayout ); this.setTitle( "Ejemplo de BorderLayout" ); this.setSize( 300,300 ); MiCanvas miObjCanvas = new MiCanvas(); this.add( miObjCanvas,"Center" ); Tema 13. AWT y Swing 44 GridLayout this.add( new Button( "Norte" ),"North" ); La composición GridLayout proporciona gran flexibilidad para situar Componentes. El controlador de posicionamiento se crea con un determinado número de filas y columnas y los Componentes van dentro de las celdas de la tabla así definida. this.add( new Button( "Sur" ),"South" ); this.add( new Button( "Este" ),"East" ); this.add( new Button( "Oeste" ),"West" ); // Ahora se podrán ver this.setVisible( true ); Tema 13. AWT y Swing 45 GridLayout 46 Componentes de Swing GridLayout miGridLayout = new GridLayout( 2,3 ); panel1.setLayout( miGridLayout ); for( int i=0; i < 6; i++) panel1.add( new Button( "Boton"+i ) ); miFrame.add( panel1,"North" ); Tema 13. AWT y Swing Tema 13. AWT y Swing 47 Swing es paso adelante respecto al AWT. Ahora los Componentes del interfaz gráfico son Beans y utilizan el nuevo modelo de Delegación de Eventos de Java. Swing está totalmente escrito en Java. la navegación con el teclado es automática Para pasar de AWT a Swing suele bastar con añadir una "J" al componente Tema 13. AWT y Swing 48 8 Bordes Bordes La clase JComponent también contiene un método llamado setBorder(), que permite colocar diferentes bordes a un componente visible. Tema 13. AWT y Swing En el constructor de un JPanel import com.sun.java.swing.border.*; setLayout( new GridLayout( 2,4 ) ); add( creaBorde( new TitledBorder("Titulo") ) ); add( creaBorde( new EtchedBorder() ) ); add( creaBorde( new LineBorder(Color.blue) ) ); add( creaBorde( new MatteBorder(5,5,30,30,Color.green) ) ); add( creaBorde( new BevelBorder(BevelBorder.RAISED) ) ); ... 49 JButton Tema 13. AWT y Swing 50 JLabel El JButton parece igual que el botón que hay en el AWT, pero se pueden hacer muchas más cosas con él. Todos los botones, además, tienen ahora la posibilidad de incorporar imágenes a través del objeto Icon En Swing, al derivar de JComponent, la clase JLabel implementa todas las características inherentes a los componentes Swing, como pueden ser los aceleradores de teclado, bordes, y demás. Icon imagen = new ImageIcon( "miDibujo.gif" ); JLabel etiq3 = new JLabel( "Etiqueta3", imagen,SwingConstants.CENTER ); Tema 13. AWT y Swing 51 JList Tema 13. AWT y Swing 52 Dialogos Las lista y cajas "combo" en Swing funcionan del mismo modo que lo hacían en el AWT, aunque mejoran algunas cosas. Por ejemplo, JList tiene un constructor al que se puede pasar un array de objetos String para que los presente. Tema 13. AWT y Swing 53 Swing también proporciona nuevos modelos de diálogos predefinidos del sistema, como son en diálogo de selección de colores, el diálogo de selección de ficheros, diálogos de aviso, error y confirmación, y algunos más. La apariencia es muy distinta a la que se presentaba en el AWT en algunos casos, por ejemplo en la selección de ficheros:El objeto JFileChooser no abre ni salva nada, sino que se limita a seleccionar el nombre del fichero Tema 13. AWT y Swing 54 9 Dialogos de Opción Combo box int res = JOptionPane.showConfirmDialog( this,"Responda Si o No", "Dialogo de Opción",JOptionPane.YES_NO_OPTION ); if( res == JOptionPane.YES_OPTION ).... Tema 13. AWT y Swing 55 Slider Tema 13. AWT y Swing 56 Tema 13. AWT y Swing 58 Spinner Tema 13. AWT y Swing 57 FileChooser Eventos Event Source Tema 13. AWT y Swing 59 Listener Tema 13. AWT y Swing 60 10 Eventos Interface Listener java.util EventObject Listener Interface Event Listener Methods ActionListener ActionEvent actionPerformed() AdjustmentListener AdjustmentEvent adjustmentValueChanged() ComponentListener ComponentEvent componentHidden() componentMoved() componentResized() componentShown() ContainerListener ContainerEvent componentAdded() componentRemoved() FocusListener FocusEvent focusGained() focusLost() java.awt.event ActionEvent ContainerEvent AdjustmentEvent FocusEvent java.awt KeyEvent AWTEvent InputEvent ComponentEvent MouseEvent ItemEvent PaintEvent TextEvent WindowEvent Tema 13. AWT y Swing 61 Interface Listener Tema 13. AWT y Swing Interface Listener Listener Interface Event Listener Methods KeyListener KeyEvent keyPressed() keyReleased() keyTyped() MouseListener MouseEvent mouseClicked() mouseEntered() mouseExited() mousePressed() mouseReleased() Listener Interface Event Listener Methods TextListener TextEvent textValueChanged() ItemListener ItemEvent itemStateChanged() WindowEvent windowActivated() windowClosed() windowClosing() windowDeactivated() windowDeiconified() windowIconified() windowOpened() WindowListener MouseMotionListener 62 mouseDragged() mouseMoved() MouseEvent Tema 13. AWT y Swing 63 Tema 13. AWT y Swing 64 Frames cerrables JFrame WindowListener extends MyCloseableJFrame implements MyWindowListener Tema 13. AWT y Swing 65 11