1. Vamos a realizar un par de ejercicios con la librería Swing, para ver qué diferencias existen con AWT, y qué posibilidades nuevas ofrece.
import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; public class JCalculadora ...
public class JCalculadora extends JFrame { ...
TextField txtOp1 = new TextField(); ... Choice operadores = new Choice(); ... TextField txtOp2 = new TextField(); ... TextField txtRes = new TextField(); ... Label lblOp1 = new Label("Primer operando:"); ... Label lblOp2 = new Label("Segundo operando:"); ... Label lblOper = new Label("Operador:"); ... Button btnRes = new Button("Primer operando:"); ...
Por las correspondientes clases Swing:
JTextField txtOp1 = new JTextField(); ... JComboBox operadores = new JComboBox(); ... JTextField txtOp2 = new JTextField(); ... JTextField txtRes = new JTextField(); ... JLabel lblOp1 = new JLabel("Primer operando:"); ... JLabel lblOp2 = new JLabel("Segundo operando:"); ... JLabel lblOper = new JLabel("Operador:"); ... JButton btnRes = new JButton("Primer operando:"); ...
getContentPane().setLayout(new GridLayout(4, 2)); ... getContentPane().add(lblOp1); getContentPane().add(txtOp1); ... getContentPane().add(lblOper); getContentPane().add(operadores); ... getContentPane().add(lblOp2); getContentPane().add(txtOp2); ... getContentPane().add(btnRes); getContentPane().add(txtRes); ...
Figura 1. Apariencia de la calculadora en Swing
2. En este segundo ejercicio probaremos algunas cosas nuevas que ofrece Swing, partiendo de una aplicación ya hecha.
Frame -> JFrame TextArea -> JTextArea MenuBar -> JMenuBar Menu -> JMenu MenuItem -> JMenuItem CheckboxMenuItem -> JCheckBoxMenuItem
import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*;
También añadimos una variable global llamada fichero que tenga el nombre del fichero donde guardar el contenido del cuadro de texto:
public class JFormatos extends JFrame implements ActionListener { JTextArea txt; boolean negrita = false, cursiva = false; String fichero = "guardar.txt"; ...
Después, en el constructor, añadimos al final el temporizador, que utilizará un PrintWriter para volcar al fichero fichero el contenido del cuadro de texto:
public JFormatos() { ... // Timer Timer tim = new Timer (10000, new ActionListener() { public void actionPerformed(ActionEvent e) { try { PrintWriter pw = new PrintWriter(new FileWriter(fichero)); pw.println(txt.getText()); pw.close(); } catch (Exception ex) {} } }); tim.setRepeats(true); tim.start(); }
¿Qué ocurriría si no pusiéramos el método setRepeats(true)?
public class JFormatos extends JFrame implements ActionListener { JTextArea txt; boolean negrita = false, cursiva = false; String fichero = "guardar.txt"; JFrame frame = this; ...
Después añadimos el botón al final del constructor, con el icono save.jpg que se tiene en la plantilla, y su evento correspondiente:
public JFormatos() { ... // Icono JButton btnSave = new JButton("Guardar", new ImageIcon("save.jpg")); btnSave.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JFileChooser jfc = new JFileChooser("."); int res = jfc.showSaveDialog(frame); if (res == JFileChooser.APPROVE_OPTION) fichero = jfc.getSelectedFile().getAbsolutePath(); } }); getContentPane().add(btnSave, BorderLayout.SOUTH); }
Observa que para añadir el icono al botón, utilizamos un
constructor de JButton con los parametros JButton(String
nombre, Icon icono), y creamos el icono con la clase ImageIcon
de Swing.
En cuanto al evento del botón, creamos un diálogo de tipo JFileChooser,
que se abrirá en el directorio actual (indicado por ".").
Observa que al llamar a showSaveDialog se abre un diálogo como
los de Guardar como... de Windows, y este diálogo devuelve un
entero, que es el resultado tras cerrarlo. Si dicho resultado es igual a
la constante JFileChooser.APPROVE_OPTION indica que el usuario ha
elegido un fichero, con lo que sólo nos queda tomar el fichero
seleccionado (getSelectedFile) y su ruta absoluta (getAbsolutePath).
A partir de entonces, el fichero donde guarde el temporizador será el
nuevo que hemos asignado.
Observa también que la variable frame que hemos creado antes, la
utilizamos para crear el diálogo, indicando de qué ventana principal
depende. En realidad, podríamos haber utilizado cualquier componente de
nuestra ventana principal.
Si hubiésemos querido abrir un fichero para leerlo, en lugar de para
guardarlo... ¿qué método de JFileChooser habría sido más
adecuado, en lugar de showSaveDialog? (consulta la API de esta
clase para averiguarlo).
3. Para terminar esta sesión, vamos a dar un rápido vistazo a los Applets. Lee primero el apartado 3.3 (Applets) del tema 3 de teoría.
import java.awt.*; import java.awt.event.*; import java.util.*; import java.applet.*; public class CalcApplet ...
public class CalcApplet extends Applet { ...
public CalcApplet() { ...
por:
public void init() { ...
<html> <body> <APPLET CODE=CalcApplet.class WIDTH=400 HEIGHT=200> </APPLET> </body> </html>
appletviewer CalcApplet.html
PARA ENTREGAR