Desarrollo de Aplicaciones en Java INF 473 Desarrollo de Interfaces Gráficas Componentes Swing II Prof. José Miguel Rubio jose.rubio.l@ucv.cl jrubio@inf.ucv.cl PUCV Marzo 2008 0
Generación de código Diferencia (en Swing y AWT) entre:» Código generado automáticamente En una IDE (como Netbeans) Se deben conservar los ficheros:» *.java» *.form» Código no generado automáticamente 1
Ejemplo 2
Ejemplo, autom. (I) public class MiVentana extends javax.swing.jframe { private int clicks; public MiVentana() { this.clicks=0; initcomponents(); private void initcomponents() { jpanel1 = new javax.swing.jpanel(); jbutton1 = new javax.swing.jbutton(); jbutton2 = new javax.swing.jbutton(); jpanel2 = new javax.swing.jpanel(); jlabel1 = new javax.swing.jlabel(); settitle("un ejemplo"); addwindowlistener (new java.awt.event.windowadapter() { public void windowclosing (java.awt.event.windowevent evt) { exitform(evt); ); 3
Ejemplo, autom. (II) jpanel1.setborder // Definido en JComponent (new javax.swing.border.lineborder (new java.awt.color(0, 0, 0))); jbutton1.settext("numero de clicks"); jbutton1.addactionlistener (new java.awt.event.actionlistener() { public void actionperformed (java.awt.event.actionevent evt) { jbutton1actionperformed(evt); ); jpanel1.add(jbutton1); jbutton2.settext("no hacer click"); jbutton2.addactionlistener (new java.awt.event.actionlistener() { public void actionperformed (java.awt.event.actionevent evt) { jbutton2actionperformed(evt); ); jpanel1.add(jbutton2);,,,,,, 4
Ejemplo, autom. (III),,,,,, getcontentpane(). add(jpanel1, java.awt.borderlayout.south); jlabel1.settext("numero de clicks: 0"); jlabel1.setborder (new javax.swing.border.lineborder (new java.awt.color(0, 0, 0))); jpanel2.add(jlabel1); getcontentpane().add(jpanel2, java.awt.borderlayout.center); pack(); private void jbutton2actionperformed (java.awt.event.actionevent evt) { // Add your handling code here: this.clicks=(this.clicks%2)/(this.clicks%2); // EXCEPCIONES RUNTIME this.jlabel1.settext("número de clicks: " + this.clicks); 5
Ejemplo, autom. (IV) private void jbutton1actionperformed (java.awt.event.actionevent evt) { // Add your handling code here: this.clicks++; this.jlabel1.settext("número de clicks: " + this.clicks); private void exitform(java.awt.event.windowevent evt) { System.exit(0); public static void main(string args[]) { new MiVentana().show(); private javax.swing.jbutton jbutton2; private javax.swing.jlabel jlabel1; private javax.swing.jbutton jbutton1; private javax.swing.jpanel jpanel2; private javax.swing.jpanel jpanel1; 6
Mensajes de error java.lang.arithmeticexception: / by zero at MiVentana.jButton2ActionPerformed(MiVentana.java:71) at MiVentana.access$200(MiVentana.java:11) at MiVentana$3.actionPerformed(MiVentana.java:52)............ at java.awt.eventdispatchthread.pumpevents (EventDispatchThread.java:130) at java.awt.eventdispatchthread.run (EventDispatchThread.java:98) El programa sigue funcionando. Funcionamiento de un programa Swing:» El hilo de tratamiento de eventos es un bucle que recoge los eventos generados y ejecuta los métodos de los listeners» En pseudocódigo: while ( hay-eventos-por-procesar ) { try { procesa-el-siguiente-evento catch (Exception exc) { exc.printstacktrace(); 7
Ejemplo, no autom. (I) import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; public class MiVentana extends JFrame implements ActionListener { private JButton jbutton2; private JLabel jlabel1; private JButton jbutton1; private JPanel jpanel2; private JPanel jpanel1; private int clicks; public MiVentana() { this.clicks=0; jpanel1 = new JPanel(); jbutton1 = new JButton(); jbutton2 = new JButton(); jpanel2 = new JPanel(); jlabel1 = new JLabel(); settitle("un ejemplo"); addwindowlistener(new WindowAdapter() { public void windowclosing(windowevent evt) { System.exit(0); ); 8
Ejemplo, no autom. (II) jpanel1.setborder (new LineBorder(new Color(0, 0, 0))); jbutton1.settext("numero de clicks"); jbutton1.addactionlistener(this); jpanel1.add(jbutton1); jbutton2.settext("no hacer click"); jbutton2.addactionlistener(this); jpanel1.add(jbutton2); getcontentpane(). add(jpanel1, BorderLayout.SOUTH); jlabel1.settext("n\u00famero de clicks: 0"); jlabel1.setborder (new LineBorder(new Color(0, 0, 0))); jpanel2.add(jlabel1); getcontentpane(). add(jpanel2, BorderLayout.CENTER); pack(); 9
Ejemplo, no autom. (III) public void actionperformed (ActionEvent evt) { if (evt.getsource()==this.jbutton1) { this.clicks++; this.jlabel1. settext("número de clicks: " + this.clicks); else if (evt.getsource()==this.jbutton2) { this.clicks=(this.clicks%2)/(this.clicks%2); this.jlabel1. settext("número de clicks: " + this.clicks); public static void main(string args[]) { new MiVentana().show(); 10
Ejemplo, no autom. (IV) Los oyentes pueden ser:» La ventana (el JFrame)» Clases anónimas (como las generadas por Netbeans)» Clases anidadas Ejemplo Clases-anidadas-oyentes» Otras clases Deberían tener acceso a los parámetros de la ventana (como tienen las clases anónimas y las internas) 11
Jerarquía de eventos javax.swing.event.listselectionevent Object java.util.eventobject java.awt.awtevent ItemEvent KeyEvent ActionEvent MouseEvent FocusEvent Paquete por defecto java.awt.event.*; Línea discontinua otras clases intermedias Clase EventObject public Object getsource() 12
JButton Clases JButton y» Constructor: JCheckBox (I) public JButton(String text)» Eventos: ActionEvent (haciendo click) JCheckBox» Constructor: public JCheckBox (String text, boolean selected)» Eventos: ActionEvent y ItemEvent (haciendo click) Evento ActionEvent public ActionEvent(Object source, int id, String command) 13
Clases JButton y JCheckBox (II) Interface ActionListener:» public void actionperformed (ActionEvent evt) Evento ItemEvent public ItemEvent(ItemSelectable source, int id, Object item, int statechange) Valores de statechange:» ItemEvent.SELECTED» ItemEvent.DESELECTED Interface ItemListener:» public void itemstatechanged (ItemEvent evt) Ejemplo:» JButton-JCheckBox 14
Ejemplo 15
JLabel» Constructor: Clases JLabel y JComboBox public JLabel(String text, Icon icon, int horizontalalignment) JComboBox» Editable o no editable» Constructor: public JComboBox(ComboBoxModel amodel) DefaultComboBoxModel (descendiente de ComboBoxModel)» Se permite modificar los elementos del modelo en tiempo de ejecución.» Eventos: ItemEvent (al seleccionar) ActionEvent (al seleccionar o apretar enter) Ejemplo:» JLabel-JComboBox 16
Ejemplo 17
JTextField Clases JTextField y» Constructor:» Eventos: JTextArea public JTextField(String text, int columns) ActionEvent (pulsando enter )» Métodos: (set get)text JTextArea» Constructor:» Métodos: public JTextArea(String text, int rows, int columns) public void append(string str) (set get)text 18
Clase JScrollPane JScrollPane» Métodos: public void sethorizontalscrollbarpolicy(int policy)» JScrollPane.HORIZONTAL_SCROLLBA R_AS_NEEDED» JScrollPane.HORIZONTAL_SCROLLBA R_NEVER» JScrollPane.HORIZONTAL_SCROLLBA R_ALWAYS public void setviewportview(component view) Incluir una componente» Constructor: public JScrollPane(Component view) Equivalente a haber hecho setviewport y política AS_NEEDED horizontal y vertical Ejemplo:» JTextField-JTextArea-JScrollPane 19
Ejemplo 20
JList Clases JList y JDialog (I)» Selección simple o múltiple» Constructor: public JList(ListModel datamodel)» Eventos: javax.swing.event.listselectionevent Interface ListModel. Descendientes:» AbstractListModel (clase abstracta) DefaultListModel Permite modificar los elementos en tiempo de ejecución. 21
Clases JList y JDialog (II) JDialog» Análogo a un JFrame, aunque: Modal (única ventana activable) El thread principal de eventos queda bloqueado al hacer setvisible(true) en el diálogo. Se desbloquea al hacer setvisible(false) en el diálogo.» Se genera otro thread para los eventos de la ventana de diálogo. No modal» Constructor: public JDialog(Dialog owner, boolean modal) Ventanas de diálogo predefinidas:» javax.swing.joptionpane Es extends JComponent» Dos posibles usos: Primer uso: public static int showconfirmdialog(component parentcomponent, Object message). Valores de retorno:» JOptionPane.YES_OPTION» JOptionPane.NO_OPTION» JOptionPane.CANCEL_OPTION 22
Clases JList y JDialog Segundo uso: (III) public JOptionPane(Object message, int messagetype, int optiontype)» messagetype: JOptionPane.QUESTION_MESSAGE, etc» optiontype: JOptionPane.YES_NO_CANCEL_OPTI ON, etc Luego utilizar:» public JDialog createdialog(component parentcomponent, String title) Valor de retorno:» Método getvalue() en clase JOptionPane En cualquier ventana de diálogo, por defecto:» Al hacer click en esquina superior derecha, la ventana desaparece. Ejemplo:» JList-JDialog 23
Ejemplo 24
Menus/Ventanas (I) Una Interfaz de Usuario maneja datos realizando:» Introducción de datos» Procesamiento de datos» Visualización de resultados Posibles interfaces de usuario:» Menús» Ventanas Ejemplo» Menus-Ventanas 25
Menus/Ventanas (II) 26