1. En esta sesión vamos a realizar dos ejemplos con AWT. El primero de ellos va a simular una calculadora sencilla, con este aspecto:
Figura 1. Apariencia de la calculadora
En el primer cuadro de texto ponemos el primer operando, luego elegimos la operación a realizar (suma '+', resta '-', o multiplicación '*'), y en el segundo cuadro de texto ponemos el segundo operando. Pulsando en Calcular mostraremos el resultado en el tercer cuadro de texto.
public Calculadora() { setSize(300, 150); setLayout(new GridLayout(4, 2));
public Calculadora() { ... // Primer operando Label lblOp1 = new Label("Primer operando:"); TextField txtOp1 = new TextField(); add(lblOp1); add(txtOp1); // Operador Label lblOper = new Label ("Operador:"); Choice operadores = new Choice(); operadores.addItem("+"); operadores.addItem("-"); operadores.addItem("*"); add(lblOper); add(operadores); // Segundo operando Label lblOp2 = new Label("Segundo operando:"); TextField txtOp2 = new TextField(); add(lblOp2); add(txtOp2); // Boton de calcular y cuadro de resultado Button btnRes = new Button ("Calcular"); TextField txtRes = new TextField(); add(btnRes); add(txtRes); }
public Calculadora() { ... // Evento sobre el botón btnRes.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int op1, op2; try { // Tomar los dos operandos op1 = Integer.parseInt(txtOp1.getText()); op2 = Integer.parseInt(txtOp2.getText()); // Hacer la operacion segun el operador seleccionado if (((String)(operadores.getSelectedItem())).equals("+")) txtRes.setText("" + (op1 + op2)); else if (((String)(operadores.getSelectedItem())).equals("-")) txtRes.setText("" + (op1 - op2)); else if (((String)(operadores.getSelectedItem())).equals("*")) txtRes.setText("" + (op1 * op2)); } catch (Exception ex) { txtRes.setText("ERROR EN LOS OPERANDOS"); } } }); }
public Calculadora() { ... this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); }
public Calculadora() { ... TextField txtOp1 = new TextField(); ... Choice operadores = new Choice(); ... TextField txtOp2 = new TextField(); ... TextField txtRes = new TextField(); ... }
Por estas:
public Calculadora() { ... final TextField txtOp1 = new TextField(); ... final Choice operadores = new Choice(); ... final TextField txtOp2 = new TextField(); ... final TextField txtRes = new TextField(); ... }
O bien colocarlas fuera del constructor, como variables globales:
public class Calculadora ... { TextField txtOp1 = new TextField(); Choice operadores = new Choice(); TextField txtOp2 = new TextField(); TextField txtRes = new TextField(); public Calculadora() { ... } ... }
2. Ahora vamos a construir otra aplicación desde cero. Para resumir los pasos que hemos dado en el ejercicio anterior, lee el apartado 3.1.4 (Pasos generales para construir una aplicación gráfica con AWT) del tema 3 de teoría.
La aplicación que vamos a construir ahora no es más que un bloc de notas "reducido", donde podremos cambiar algunas características de la fuente con que escribimos. La ventana tendrá una apariencia como la siguiente:
Figura 2. Apariencia de nuestro "bloc de notas"
Vemos que sólo hay un cuadro de texto grande donde escribir, y un menú llamado Formato donde irán todas las opciones para cambiar el formato de la fuente. Dichas opciones serán cambiar el color entre rojo y negro, y cambiar el estilo entre normal, cursiva y/o negrita.
import java.awt.*; import java.awt.event.*; public class Formatos extends Frame { ...
public class Formatos extends Frame { TextArea txt; boolean negrita = false; boolean cursiva = false; public Formatos() { setSize(200, 200); // Menú MenuBar mb = new MenuBar(); Menu m = new Menu("Formato"); MenuItem mi = new MenuItem("Color Negro"); mi.addActionListener(this); m.add(mi); mi = new MenuItem("Color Rojo"); mi.addActionListener(this); m.add(mi); CheckboxMenuItem cmi = new CheckboxMenuItem("Negrita"); cmi.addItemListener(this); m.add(cmi); cmi = new CheckboxMenuItem("Cursiva"); cmi.addItemListener(this); m.add(cmi); mb.add(m); setMenuBar(mb); // Area de texto txt = new TextArea(); txt.setFont(new Font("Arial", Font.PLAIN, 16)); add(txt, BorderLayout.CENTER); } }Las variables globales negrita y cursiva de momento no las utilizamos, pero más adelante las emplearemos para guardar en todo momento si están marcadas las opciones de letra negrita o cursiva, respectivamente. En el cuadro de texto establecemos una fuente Arial de 16 puntos, y sin estilo (sin negrita ni cursiva, indicado en la constante Font.PLAIN).
public class Formatos extends Frame implements ActionListener, ItemListener { ...
public class Formatos extends Frame implements ActionListener, ItemListener { ... public Formatos() { ... } public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("Color Negro")) { txt.setForeground(Color.black); } else if (e.getActionCommand().equals("Color Rojo")) { txt.setForeground(Color.red); } }
¿Cómo hacemos para distinguir qué opción del menú se ha pulsado
en el actionPerformed? ¿Qué método se utiliza para cambiar el
color de la fuente de un cuadro de texto? ¿Qué error daría si no
hubiésemos puesto la variable txt del área de texto como
global?
public class Formatos extends Frame implements ActionListener, ItemListener { ... public Formatos() { ... } ... public void itemStateChanged(ItemEvent e) { String item = (String)(e.getItem()); if (item.equals("Negrita")) negrita = !negrita; else if (item.equals("Cursiva")) cursiva = !cursiva; txt.setFont(new Font("Arial", (negrita?Font.BOLD:0) | (cursiva?Font.ITALIC:0), 16)); }
Observa que seguimos manteniendo, como en el constructor, una fuente
Arial de 16 puntos. También observa que utilizamos las variables
globales negrita y cursiva definidos al principio de la
clase. Según si estos flags son verdaderos o falsos, establecemos una
combinación de los mismos (con Font.BOLD y Font.ITALIC).
¿Cómo hacemos aquí para distinguir qué opción del menú se ha
pulsado? ¿Qué método se utiliza para cambiar la fuente de un cuadro
de texto? ¿Qué significa el segundo parámetro de dicho método?
public Formatos() { ... this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); }
PARA ENTREGAR