Programación Java Curso 2006 - 1 C GUI Prof.. María Feldgen Ing. Osvaldo Clúa FIUBA Introducción: Java 1.0 poseía un modelo de interface gráfica o GUI (Graphical User Interface) que se basaba en la plataforma en la que se implementaba java. Cada elemento de la GUI era mapeado sobre algún elemento adecuado de la plataforma, llamado peer. Se podían manipular los peers en forma directa. Java 1.1 introduce un nuevo modelo de interface gráfica: AWT (Abstract Window Toolkit); al mismo tiempo que deja obsoleta (deprecated) al modelo anterior. Este es el modelo que vamos a usar en el curso. Java 1.x (o Java 2 según el marketing de SUN) introduce Swing que es un marco de trabajo o framework que facilita la creación y uso de las GUI. Usaremos AWT Es muy importante contar con la documentación (no el tutorial) ya que los métodos y clases no van a ser presentados en detalle. Explorando AWT 1. /** PruBoton: Botones en AWT 2. Estos botones no hacen nada, es mas; para salir de 3. la aplicacion hay que dar Control-C en la ventana de invocacion. 4. */ 5. import java.awt.*; /* hace accesible el package */ 6. 7. class PruBoton extends Frame 8. { PruBoton(String s) 9. { super(s); 10. setSize(200,100); 11. setLayout(new FlowLayout()); // Manejador de Layout 12. for (int i=0; i<6; i++) 13. add(new Button("Boton " + i)); 14. setVisible(true); 15. } Y para probarla usamos la clase 16.class TestPruBoton 17.{ public static void main(String[] args) 18. { PruBoton buttonFrame = new PruBoton("Ejemplo de Botones"); 19. } 20.} De las muchas clases que componen el package java.awt .extendemos a la clase Frame. La genealogía de esta clase es: -1- Java 2006 Guía 4 Prof.: Lic. Ing. Osvaldo Clúa Prof. C.C. Maria Feldgen FIUBA/EGRIET. java.lang.Object clase madre de todas -- java.awt.Component Es un objeto con representación gráfica, que puede interactuar con el usuario -----java.awt.Container Es un componente capaz de contener otros componentes --------java.awt.Window Es una ventana sin bordes, capaz de obtener foco ------------java.awt.Frame Es una ventana con bordes y título Su único método es un constructor, que llama al constructor de su Super con un String que aparecerá como título ("Ejemplo de Botones") en TestPruButton. Completar usando la documentación: La llamada setSize(...) indica el tamaño en pixels y es un método de .................. (completar) setLayout(...) crea un new Flowlayout() y lo activa como el manejador de Layout. Es un método de la clase ..................... El manejador de Layout es el responsable de como se verán los componentes de un container, y como reaccionaran ante las operaciones de cambio de tamaño o resizing. Luego se agregan 6 botones con una etiqueta; y se hace visible al conjunto con setVisible(...) que es de la clase ............... Ejemplo anterior en Swing 2. /** PruBoton: Botones en Swing 3. Estos botones no hacen nada, es mas; para salir de 4. la aplicacion hay que dar Control-C en la ventana 5. de invocacion. 6. */ 7. import java.awt.*; 8. import javax.swing.*; 9. 10.class PruBoton extends JFrame 11.{ PruBoton(String s) 12. { super(s); 13. setSize(200,100); 14. getContentPane().setLayout(new FlowLayout()); 15. // Manejador de Layout 16. for (int i=0; i<6; i++) 17. getContentPane().add(new JButton("Boton " + i)); 18. setVisible(true); 19. } 20.} Ejercicios básicos: 1) Probar el resultado de usar como LayoutManager a BorderLayout,. Seguir los ejemplos de la documentación. 2) Escribir una clase que despliegue seis Checkbox. Los tres últimos deben pertenecer a un mismo CheckboxGroup 3) Escribir una clase que despliegue una Choice con los Ítems ("ichi", "ni", "san", "yon", "go",...,"ju") (o sea, los números del 1 al 10 en ...................) 4) En el ejercicio 3, usar una List en vez de una Choice. Eventos: En Java los objetos AWT pueden generar eventos. En realidad, cualquier objeto puede generarlos pero la funcionalidad de los objetos AWT ya incluye esta posibilidad. Un objeto capaz de generar eventos es un objeto Observable. -2- Java 2006 Guía 4 Prof.: Lic. Ing. Osvaldo Clúa Prof. C.C. Maria Feldgen FIUBA/EGRIET. Además, Cualquier Objeto es capaz de recibir eventos. Un objeto capaz de recibir eventos es un objeto Observer. La clase madre de todos los eventos en AWTEvent y las subclases son ComponentEvent, FocusEvent, KeyEvent, MouseEvent, WindowEvent, ActionEvent, AdjustmentEvent, ItemEvent, TextEvent. La clase AWTEvent tiene los siguientes métodos: AWTEvent( Object source, int id) lo crea public int getID( ) devuelve la ID o tipo del evento public String toString() public String paramString() Para ver parámetros del usuario protected void consume() Marca el evento como consumido protected boolean isConsumed() indica si fue marcado En general, el usuario no maneja esta clase en forma indirecta, sino que le interesan las subclases ComponentEvent, tiene una serie de subclases para el manejo de eventos de bajo nivel (apretar y soltar teclas, etc.) FocusEvent, KeyEvent, MouseEvent, AdjustmentEvent, son propias de cada componente WindowEvent se refiere a los controles de la ventana (por ejemplo, el botón de cierre) ActionEvent es el mas usado, ya que se activa al accionar un componente (click de un botón, selección de una lista, tecla return en un TextField ItemEvent cuando un ítem es seleccionado o des-seleccionado. Para tratar a los eventos, se deben programar ciertos métodos. Estos métodos se agrupan según lo tipos de eventos en un archivo que indica nada mas que los tipos involucrados llamado interface. Se dice que el objeto debe implementar la interface. Estas interfaces para eventos (listener) son: ActionListener, AdjustmentListener, ComponentListener, ContainerListener, FocusListener, ItemListener, KeyListener, MouseListener, MouseMotionListener, TextListener, WindowListener ActionListener tiene un único método actionPerformed(ActionEvent e) que es el usado para manejar eventos de ese tipo. WindowListener tiene siete métodos: windowActivated(WindowEvent), windowClosed(WindowEvent), windowClosing(WindowEvent), windowDeactivated(WindowEvent) windowDeiconified(WindowEvent), windowIconified(WindowEvent), windowOpened(WindowEvent). Si solo nos interesa manejar el botón de cerrar, deberíamos programar WindowClosing( ) pero la interface nos obliga a programar los siete Para evitar esto, existe una clase que ya los tiene programados, pero que no hacen nada. Esta clase es un adapter y se llama WindowAdapter de manera que lo único necesario es extender la clase WindowAdapter y reprogramar windowClosing(...) Para atender un evento, es decir, para hacerse observable, la clase debe registrarse. Para ello, los componentes disponen de los métodos necesarios. Como ejemplo: 1. /** BotonesList Al oprimir el boton se agrega un item a la lista 2. */ 3. import java.awt.*; 4. import java.awt.event.*; // para importar java.awt.event.* 5. 6. class BotonesList extends Frame implements ActionListener 7. // ActionListener es la escucha generica -3- Java 2006 Guía 4 Prof.: Lic. Ing. Osvaldo Clúa Prof. C.C. Maria Feldgen 8. FIUBA/EGRIET. // tiene un solo metodo :actionPerformed 9. { public Button []boton ; 10. public List lista; 11. 12. BotonesList(String s) 13. { super(s); // Crea el frame con titulo 14. setSize(200,160); 15. setLayout(new FlowLayout()); 16. boton=new Button[6]; 17. for (int i=0; i<6; i++){ 18. boton[i]=new Button("Boton " + i); 19. add(boton[i]); 20. boton[i].addActionListener(this);} 21.// Es el propio manejador de eventos, por eso se usa this 22. lista= new List (4); // Lista con cuatro elementos visibles add(lista); //Uso de un Adapter para no hacer seis nulos y uno que sirva addWindowListener( new WindowAdapter () { public void windowClosing(WindowEvent event) { setVisible(false); System.exit(0); } } ); // Eso es todo amigos ... La clase se declara en el llamado setVisible(true); } 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. public void actionPerformed(ActionEvent event) 34.// El manejador de eventos 35. { lista.add(event.getActionCommand()); } 36.} Ejercicios básicos con eventos: (Todos deben manejar el botón de cerrar de la ventana) 1) Para el ejercicio 3 de los ejercicios básicos, proveer un Label donde aparezca el ítem seleccionado y lo traduzca. 2) Escribir una clase con dos List y una TextArea donde aparezcan los Ítems seleccionados de cada List, indicando de que List fueron tomados. -4- Java 2006 Guía 4 Prof.: Lic. Ing. Osvaldo Clúa Prof. C.C. Maria Feldgen FIUBA/EGRIET. 3) Agregar al ejercicio de los Botones una List que indique que botón fue oprimido. 4) Escribir una clase con tres botones. Dos de ellos se habilitan y deshabilitan según un tercero. Cada click debe quedar registrado en una TextArea 5) Escribir una clase con una Scrollbar horizontal. su Maximun es de 10000 y su BolckIncrement de 100. Al cambiar su posición, un AdjustmentListener implementará el método adjustementValueChanged y pasará este valor a un TextField. 6) Para el ejercicio 5, escribir además el paso inverso (Un nuevo valor en el TextField cambia el Scrollbar). 7) Combinar el ejercicio 6 con una List de unidades para obtener un valor y una unidad (Km, m, cm) y colocar lo obtenido en un Label. -5- Java 2006 Guía 4 Prof.: Lic. Ing. Osvaldo Clúa Prof. C.C. Maria Feldgen FIUBA/EGRIET. 8) Al ejercicio 7 añadirle otro Label donde aparezca el valor convertido en inches. 9) Combinar dos interfaces como las del ejercicio 7 para poder pasar en ambos sentidos de km, m y cm a inch, feet, yard o mile en forma gráfica (con el scrollbar) o textual indistinta. -6-