Download 1 Interfaz gráfica de usuario (GUI)
Document related concepts
no text concepts found
Transcript
Instituto Superior de Formación Técnica 179 Programación II Unidad III Interfaz gráfica de usuario 1 Interfaz gráfica de usuario (GUI) El lenguaje de programación Java proporciona varias herramientas para crear programas que presenten una interfaz gráfica al usuario. Hay dos paquetes que permiten desarrollar un entorno amigable: el paquete AWT y el paquete Swing. Según la necesidad, podemos combinar elementos de ambos paquetes. 2 El paquete AWT (Abstract Windows Toolkit) Este paquete proporciona objetos gráficos, como botones, listas desplegables, cuadros de texto, ventanas o formularios. Permite manejar eventos que se activan cuando el usuario presiona una tecla o hace clic con el Mouse sobre uno de los objetos. Para utilizar el paquete AWT y capturar eventos deben agregarse las siguientes cabeceras: import java.awt.*; import java.awt.event.*; 3 El paquete Swing Es similar al anterior, pero facilita el manejo del entorno gráfico y agrega algunas mejoras. Para utilizar el paquete Swing debe agregarse la cabecera: import javax.swing.*; Podemos distinguir las clases de ambos paquetes, ya que las del paquete Swing comienzan con la letra J. 3.1 Programa de ejemplo El siguiente programa utiliza varios componentes del paquete Swing. A continuación te describo cada línea de código. 1 Instituto Superior de Formación Técnica 179 Programación II Unidad III Interfaz gráfica de usuario import javax.swing.*; import java.awt.*; import java.awt.event.*; //la clase GuiAct01 hereda los elementos de un marco genérico y responde a eventos public class GuiAct01 extends JFrame implements ActionListener { //se declaran una etiqueta, dos botones y un panel private JLabel ltit; private JButton bsup; private JButton binf; private JPanel p1; public GuiAct01(){ //se invoca al constructor de JFrame super("GUI"); //se instancian los objetos ltit = new JLabel("Ejemplo N° 1"); bsup = new JButton("Superior"); binf = new JButton("Inferior"); p1 = new JPanel(); //se establece el tipo de fuente de la etiqueta ltit.setFont(new Font("Helvetica",Font.PLAIN,20)); //los botones responden a eventos bsup.addActionListener(this); binf.addActionListener(this); //el panel tiene un borde alrededor p1.setBorder(BorderFactory.createEmptyBorder(10, 30, 10, 30)); //el panel tiene varias filas y una columna p1.setLayout(new GridLayout(0, 1)); //se agrega la etiqueta al panel p1.add(ltit); //se agrega un separador de 10 pixeles de altura p1.add(Box.createRigidArea(new Dimension(0,10))); //se agregan los botones p1.add(bsup); p1.add(binf); //se establece el panel como contenedor setContentPane(p1); } //Se detecta el botón que fue oprimido public void actionPerformed(ActionEvent e) { String texto=""; if(e.getActionCommand().equals("Superior")) texto="Se oprimió el botón superior"; else if(e.getActionCommand().equals("Inferior")) texto="Se oprimió el botón inferior"; 2 Instituto Superior de Formación Técnica 179 Programación II Unidad III Interfaz gráfica de usuario //se muestra un cuadro de diálogo JOptionPane.showMessageDialog(this,texto,"Información al usuario",JOptionPane.INFORMATION_MESSAGE); } public static void main(String[] args) { JFrame frame = new GuiAct01(); //se maneja el evento correspondiente al botón cerrar WindowListener l = new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }; //el marco responde a este evento frame.addWindowListener(l); //el marco se dimensiona según el tamaño de sus componentes frame.pack(); //el marco se hace visible frame.setVisible(true); } } Como pudiste observar, la programación del entorno gráfico es una tarea compleja que requiere varias líneas de código. El conocer todas las herramientas a fondo llevaría todo el año. Por eso te recomiendo que empieces de a poco y vayas probando más componentes a medida que te familiarices con ellos. Nosotros vamos a trabajar con los componentes más comunes: marcos, paneles, botones, etiquetas, cuadros de texto y cuadros de diálogo. A medida que los programas requieran el conocimiento de algún componente más, lo iremos agregando. 4 La clase JFrame Un Frame o marco es un contenedor de alto nivel. Tiene un borde, un título y botones para cerrar, minimizar, maximizar y restaurar similares a las ventanas de Windows. El marco tiene un panel principal, donde se agregan otros componentes. 3 Instituto Superior de Formación Técnica 179 Programación II Unidad III Interfaz gráfica de usuario 5 La clase JPanel Un Panel o panel es un contenedor de propósito general. Para ubicar sus componentes en forma apropiada, utiliza controladores de distribución. Los controladores más usados son FlowLayout, BorderLayout, BoxLayout. 5.1 BorderLayout Este controlador utiliza cinco áreas “geográficas” para distribuir los componentes: north, south, east, west y center. El espacio extra se ubica en el área central. No es obligatorio usar las cinco áreas simultáneamente. Los paneles pueden anidarse, colocando uno dentro de otro. El constructor admite dos formas: BorderLayout() BorderLayout(int horizontalGap, int verticalGap) La primera forma no deja espacio entre los componentes. La segunda establece la cantidad de pixeles horizontales y verticales entre componentes. El siguiente ejemplo muestra la ubicación de 5 botones, uno en cada región. Si maximizás el formulario, vas a observar que la región central ocupa todo el espacio disponible. import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Border extends JFrame { private JButton bnor; private JButton bsur; private JButton best; private JButton boes; private JButton bcen; public Border() { super("Border Layout"); bnor=new JButton("Norte"); bsur=new JButton("Sur"); best=new JButton("Este"); boes=new JButton("Oeste"); bcen=new JButton("Centro"); getContentPane().setLayout(new BorderLayout()); getContentPane().add("North", bnor); getContentPane().add("South", bsur); 4 Instituto Superior de Formación Técnica 179 Programación II Unidad III Interfaz gráfica de usuario getContentPane().add("East", best); getContentPane().add("West", boes); getContentPane().add("Center", bcen); } public static void main(String args[]) { JFrame frame = new Border(); WindowListener l = new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }; frame.addWindowListener(l); frame.pack(); frame.show(); } } 5.1.1. Actividad 1. Creá una clase con un marco que utilice BorderLayout(). 2. Agregá dos paneles (pnor y psur), uno al norte y el otro al sur. 3. Configurá el color de fondo como rojo y verde respectivamente. La sintaxis es: pnor.setBackground (Color.red) y psur.setBackground (Color.green). 4. Compilá y ejecutá la clase. 5. Maximizá el formulario y observá el nuevo tamaño ocupado. 5.2 FlowLayout Este controlador es muy fácil de utilizar. Simplemente ubica los componentes uno al lado del otro en la misma fila, o en filas sucesivas cuando no hay más lugar. Por defecto los componentes se ubican centrados, pero puede modificarse la configuración para ajustarlos a izquierda o a derecha. Hay tres formatos posibles para los constructores: public FlowLayout() public FlowLayout(int alineación) public FlowLayout(int alineación, int horizontalGap, int verticalGap) 5 Instituto Superior de Formación Técnica 179 Programación II Unidad III Interfaz gráfica de usuario El siguiente ejemplo ubica dos componentes en la primera fila y el tercero en la segunda fila, alineado hacia la izquierda. import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Flow extends JFrame { private JButton b1; private JTextField t1; private JButton b2; public Flow() { super("Flow Layout"); b1=new JButton("Este botón es una prueba de FlowLayout() que se ubica en la primera fila"); t1=new JTextField("Este texto entra en la misma linea y ocupa hasta el final de la fila"); b2=new JButton("Este boton no tiene que entrar en la misma fila, sino escribir más texto"); getContentPane().setLayout(new FlowLayout(FlowLayout.LEFT)); b1.setFont(new Font("Helvetica",Font.PLAIN,20)); t1.setFont(new Font("Helvetica",Font.PLAIN,20)); b2.setFont(new Font("Helvetica",Font.PLAIN,20)); getContentPane().add(b1); getContentPane().add(t1); getContentPane().add(b2); } public static void main(String args[]) { JFrame frame = new Flow(); WindowListener l = new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }; frame.addWindowListener(l); frame.pack(); frame.show(); } } 5.2.1. Actividad 1. Creá una clase con un marco que implemente FlowLayout. 2. Agregá tres botones centrados en la primera fila con los títulos: uno, dos y tres. 6 Instituto Superior de Formación Técnica 179 Programación II Unidad III Interfaz gráfica de usuario 3. Al pulsar cada botón se muestra un cuadro de diálogo que indica el botón presionado. 5.3 GridLayout Este controlador ubica los componentes en una grilla con tantas filas y columnas como indiquemos. Si una de las dos dimensiones es desconocida, se escribe un cero. Todas las celdas son del mismo tamaño. La sintaxis es: public GridLayout(int filas, int columnas) public GridLayout(int filas, int columnas, int horizontalGap, int verticalGap) El siguiente es un ejemplo del uso de GridLayout: import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Grid extends JFrame { private JLabel l1; private JLabel l2; private JTextField t1; private JTextField t2; public Grid() { super("Grid Layout"); l1=new JLabel("Primero"); l2=new JLabel("Segundo"); t1=new JTextField(20); t2=new JTextField(20); getContentPane().setLayout(new GridLayout(0,2,10,10)); getContentPane().add(l1); getContentPane().add(t1); getContentPane().add(l2); getContentPane().add(t2); } public static void main(String args[]) { JFrame frame = new Grid(); WindowListener l = new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }; frame.addWindowListener(l); 7 Instituto Superior de Formación Técnica 179 Programación II Unidad III Interfaz gráfica de usuario frame.pack(); frame.show(); } } 5.3.1. Actividad 1. Crear una clase que implemente un distribuidor GridLayout de 1 columna y un número indeterminado de filas. 2. Agregar una etiqueta de título con un tamaño de letra mayor que el resto, un cuadro de texto y un botón. 6 La clase JButton Ya estuviste trabajando con botones, ahora simplemente vamos a describir sus características más comunes. Al instanciar un JButton, se le agrega un texto descriptivo, como: JButton bace=new JButton(“Aceptar”); Si se desea habilitar o deshabilitar un botón, la sintaxis es: bace.setEnabled(true); bace.setEnabled(false); Para que responda a eventos: b1.addActionListener(this); Para detectar cuál botón fue presionado: public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("Aceptar")) ......... } 8 Instituto Superior de Formación Técnica 179 Programación II Unidad III Interfaz gráfica de usuario 7 La clase JLabel Esta clase implementa una etiqueta no editable. El texto que se muestra puede determinarse en el momento de la instanciación o más adelante: JLabel lnom=new JLabel(“Nombre: “); lnom.setText(“Apellido y nombre: “); Para obtener el texto de una etiqueta la sintaxis es: String texto=lnom.getText(); 8 La clase JTextField El JTextField es un cuadro de texto editable. Como ya estarás notando, la sintaxis de todos los componentes es parecida. Para crear un objeto que muestre un texto inicialmente: JTextField tnom=new JTextField(“Perez “); tnom.setText(“Juan Perez“); Para obtener el texto de un cuadro de texto la sintaxis es: String texto=tnom.getText(); Para determinar si el texto puede editarse o no: tnom.setEditable(true); tnom.setEditable(false); El cuadro de texto puede responder a eventos, por ejemplo cuando el usario pulsa <enter> dentro de éste. Para detectar este evento, la sintaxis es: public void actionPerformed(ActionEvent e) { if(e.getSource() == tnum) buscar(); } 9 Instituto Superior de Formación Técnica 179 Programación II Unidad III Interfaz gráfica de usuario 9 La clase JTextArea Con esta clase se puede implementar un área de texto de varias líneas, opcionalmente editable. Para instanciar un área de texto, la sintaxis es: JTextArea jtarea=new JTextArea(filas, columnas); Para habilitarlo o deshabilitarlo: jtarea.setEnabled(true); jtarea.setEnabled(false); Para colocar texto, eliminando el anterior: jtarea.setText(“texto”); Para agregar texto al final: jtarea.append(“texto”); 10 La clase JScrollPane Esta clase implementa un panel deslizable que puede agregarse a otro componente. Es muy común emplearlo junto a un área de texto, como en el ejemplo: JScrollPane jspane = new JScrollPane(jtarea); El panel deslizable es el que se agrega en el panel contenedor: panel.add(jspane); 10 Instituto Superior de Formación Técnica 179 Programación II Unidad III Interfaz gráfica de usuario 11 La clase JOptionPane Esta clase permite crear cuadros de diálogo y configurarlos según el destino que se les va a dar. Te voy a explicar brevemente los diálogos básicos, pero te aconsejo que investigues otras posibilidades más completas. 1. Un cuadro de diálogo con un botón “Aceptar”. JOptionPane.showMessageDialog(lugar,mensaje,título,ícono); lugar: indica la ubicación física del cuádro de diálogo, dentro de un componente. 2. Un cuadro de diálogo con tres botones, “Sí”, “No”, “Cancelar”. Tiene un valor de retorno que indica cuál botón se oprimió. int opción= JOptionPane.showConfirmDialog (lugar,mensaje,título,ícono); El valor de retorno puede ser una de estas constantes: JOptionPane.YES_OPTION) JOptionPane.NO_OPTION) JOptionPane.CANCEL_OPTION) Con una alternativa se puede preguntar por el valor de retorno y decidir una acción. 11.1 Íconos Hay cinco posibilidades de íconos: Sin ícono: JOptionPane.PLAIN_MESSAGE 11 Instituto Superior de Formación Técnica 179 Programación II Unidad III Interfaz gráfica de usuario Pregunta: JOptionPane.QUESTION_MESSAGE Información: JOptionPane.INFORMATION_MESSAGE Advertencia: JOptionPane.WARNING_MESSAGE Error: JOptionPane.ERROR_MESSAGE 12 Ejemplo combinado El siguiente ejemplo implementa un sumador de números. El marco consta de dos cuadros de texto donde se escriben los números que se van a sumar. Al presionar el botón sumar, el resultado se muestra en otro cuadro de texto. El botón limpiar deja el formulario en blanco, como estaba inicialmente. Los datos ingresados se convierten a formato numérico para poder sumarlos. El resultado es convertido a String para mostrarlo en el cuadro de texto. En caso de error se muestra un cuadro de diálogo. import javax.swing.*; import java.awt.*; import java.awt.event.*; public class GuiAct02 extends JFrame implements ActionListener{ private JLabel ltit,lnum1,lnum2,lres; private JTextField tnum1,tnum2,tres; 12 Instituto Superior de Formación Técnica 179 Programación II Unidad III Interfaz gráfica de usuario private JButton bsum; private JButton blim; private JPanel psup,pcen,pinf; public GuiAct02(){ super("GUI"); ltit = new JLabel("Ejemplo N° 2"); lnum1=new JLabel("Primer número: "); lnum2=new JLabel("Segundo número: "); lres=new JLabel("Resultado: "); tnum1=new JTextField(); tnum2=new JTextField(); tres=new JTextField(); tres.setEditable(false); bsum = new JButton("Sumar"); blim = new JButton("Limpiar"); psup = new JPanel(); pcen = new JPanel(); pinf = new JPanel(); ltit.setFont(new Font("Helvetica",Font.PLAIN,20)); bsum.addActionListener(this); blim.addActionListener(this); psup.setLayout(new FlowLayout()); psup.add(ltit); pcen.setLayout(new GridLayout(0, 2)); pcen.add(lnum1); pcen.add(tnum1); pcen.add(lnum2); pcen.add(tnum2); pcen.add(lres); pcen.add(tres); pinf.setLayout(new FlowLayout()); pinf.add(bsum); pinf.add(blim); getContentPane().setLayout(new GridLayout(0,1)); getContentPane().add(psup); getContentPane().add(pcen); getContentPane().add(pinf); } public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("Sumar")){ sumar(); } else if(e.getActionCommand().equals("Limpiar")) limpiar(); } public void sumar(){ float num1=0,num2=0; try{ num1=Float.parseFloat(tnum1.getText()); 13 Instituto Superior de Formación Técnica 179 Programación II Unidad III Interfaz gráfica de usuario num2=Float.parseFloat(tnum2.getText()); Calculadora calc=new Calculadora(num1,num2); tres.setText(String.valueOf(calc.sumar())); }catch(NumberFormatException e){ JOptionPane.showMessageDialog(this,"Los datos no son válidos","Error",JOptionPane.ERROR_MESSAGE); } } public void limpiar(){ tnum1.setText(""); tnum2.setText(""); tres.setText(""); } public static void main(String[] args) { JFrame frame = new GuiAct02(); WindowListener l = new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }; frame.addWindowListener(l); frame.pack(); frame.setVisible(true); } } 13 Actividad 1. Escribir una clase Empleado con los siguientes atributos: numero de legajo, apellido y nombre, sueldo básico, años de antigüedad. La clase debe tener los métodos necesarios y además el método calcularSueldo() que retorne el sueldo a cobrar. El mismo se calcula de la siguiente forma: entre 0 y 9 años de antigüedad se agrega un 10% al básico entre 10 y 19 años de antigüedad se agrega un 20% al básico 20 años o más se agrega un 30% al básico A la suma de ambos importes se le descuenta un 21% en concepto de jubilación y obra social. Escribir una GUI que permita ingresar los datos de un empleado y al presionar un botón, muestre en un cuadro de texto, el sueldo a cobrar. Se debe validar que los campos de carácter no estén vacíos y que los numéricos contengan solamente números. 14 Instituto Superior de Formación Técnica 179 Programación II Unidad III Interfaz gráfica de usuario 2. Crear una GUI que permita manejar el archivo relativo cuentas.dat, definido en la unidad anterior e inicializado con registros en blanco. El marco debe tener botones que permitan dar de alta, de baja o modificar una cuenta. 3. Implementar el trabajo de archivos relativos cambiando la vista del programa: de línea de comandos a interfaz gráfica. 15