Sei sulla pagina 1di 16

Universidad Nacional de Trujillo Tecnología de la Programación II

Ingeniería de Sistemas Componentes Interfaz Gráfica de Usuario – Parte III

COMPONENTES DE LA INTERFAZ GRÁFICA DE USUARIO


Código – Parte III

1. Manejo de eventos de ventana y botones.

1.1. Crear un nuevo proyecto: ManejoEventos.

1.2. Agregar una nueva Clase Java: FrmSaludo, en el paquete eventos.

1.3. Escribir el código mostrado a continuación.

package eventos;

public class FrmSaludo extends javax.swing.JFrame {

private javax.swing.JLabel lblSaludo;


private javax.swing.JButton btnSaludo;

Ing. Zoraida Yanet Vidal Melgarejo, Mg. -1-


Universidad Nacional de Trujillo Tecnología de la Programación II
Ingeniería de Sistemas Componentes Interfaz Gráfica de Usuario – Parte III

public FrmSaludo() {
setSize(300,200);
setTitle("Saludo");
initComponents();
}

private void initComponents() {


lblSaludo = new javax.swing.JLabel();
btnSaludo = new javax.swing.JButton();
// Establecer el administrador de diseño
getContentPane().setLayout(null);
// Manejador de eventos asociado con el formulario
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
exitForm(evt);
}
});
lblSaludo.setText("etiqueta");
lblSaludo.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
lblSaludo.setFont(new java.awt.Font("Dialog", 1, 18));
getContentPane().add(lblSaludo);
lblSaludo.setBounds(42, 36, 204, 30);

btnSaludo.setToolTipText("Botón de pulsación");
btnSaludo.setMnemonic('C');
btnSaludo.setText("Haga clic aquí");
// Manejador de eventos asociado con el botón
btnSaludo.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnSaludoActionPerformed(evt);
}
});
getContentPane().add(btnSaludo);
btnSaludo.setBounds(42, 90, 204, 30);
setLocationRelativeTo(null);
}

private void exitForm(java.awt.event.WindowEvent evt) {


System.exit(0);
}

private void btnSaludoActionPerformed(java.awt.event.ActionEvent evt) {


float rojo = (float)Math.random();
float verde = (float)Math.random();
float azul = (float)Math.random();
lblSaludo.setForeground(new java.awt.Color(rojo, verde, azul));
lblSaludo.setText("¡¡¡ Hola mundo !!!");
}

public static void main(String [] args) {


try {
javax.swing.UIManager.setLookAndFeel(
javax.swing.UIManager.getCrossPlatformLookAndFeelClassName());
} catch(Exception ex) {
javax.swing.JOptionPane.showMessageDialog(new FrmSaludo(),
"No se pudo establecer el aspecto deseado", "Aviso", 2);
}
new FrmSaludo().setVisible(true);
}
}

Ing. Zoraida Yanet Vidal Melgarejo, Mg. -2-


Universidad Nacional de Trujillo Tecnología de la Programación II
Ingeniería de Sistemas Componentes Interfaz Gráfica de Usuario – Parte III

 Al ejecutar la aplicación, se obtendrá un formulario similar al que se muestra a continuación:

 El método initComponents invoca al método addWindowListener(WindowListener l) para


añadir a la ventana principal (referencias por this) un escuchador de eventos (llamados también
manejador de eventos) del tipo WindowListener. De esta forma, la aplicación podrá responder a
los eventos de ventana (por ejemplo, cerrar la ventana). Cuando en una ventana ocurre el evento
“cerrar la ventana” (clic en el botón ), se invoca automáticamente al método windowClosing,
que en el ejemplo, llama al método exitForm que finaliza la aplicación.
El argumento de addWindowListener es un objeto de una clase anónima, subclase de
WindowAdapter, que redefine al método windowClosing.

 Se asigna un administrador de diseño que permite establecer la forma en que los componentes serán
distribuidos sobre el contenedor:

 Se añaden los componentes y se editan sus propiedades:

 Se añaden los componentes al panel raíz del objeto FrmSaludo y se establece su posición en el
contenedor y su tamaño:

El método add del objeto Container devuelto por getContentPane permite añadir un
componente al contenedor, en este caso FrmSaludo. El método setBounds, heredado de la clase
java.awt.Component, permite establecer las coordenadas de la esquina superior izquierda de un
componente, su anchura y su altura.

 El método btnSaludoActionPerformed contiene el código que debe ejecutarse para responder al


evento clic de este botón. El método setForeground establece el color del primer plano; en este
caso el color del texto. Este método recibe como argumento un objeto de la clase Color que
especifica los componentes rojo, verde y azul del color RGB que representa dicho objeto. Dichos
componentes son obtenidos de forma aleatoria invocando al método random.

 Swing tiene un administrador de interfaz de usuario, UIManager, que controla la apariencia (look
and feel) de los componentes que forman una interfaz gráfica, que puede ser de estilo Windows, Motif

Ing. Zoraida Yanet Vidal Melgarejo, Mg. -3-


Universidad Nacional de Trujillo Tecnología de la Programación II
Ingeniería de Sistemas Componentes Interfaz Gráfica de Usuario – Parte III

X-Window o Java. Lo normal es establecer el estilo propio del sistema, que es devuelto por el método
getSystemLookAndFeelClassName de UIManager, o bien el estilo Java (multiplataforma) que
es devuelto por getCrossPlatformLookAndFeelClassName. Para establecer uno de estos estilos,
se invoca al método setLookAndFeel:

2. Manejo de eventos de cajas de texto, etiquetas y botones.


Se desarrollará una aplicación que permita convertir grados Centígrados a Fahrenheit, y viceversa.

2.1. Agregar una nueva Clase Java: FrmConversor, en el paquete eventos.

2.2. Escribir el código mostrado a continuación.

package eventos;

public class FrmConversor extends javax.swing.JFrame {

private javax.swing.JLabel lblGradosC;


private javax.swing.JTextField txtGradosC;
private javax.swing.JButton btnAceptar;
private javax.swing.JLabel lblGradosF;
private javax.swing.JTextField txtGradosF;
private Object objTextField;

public FrmConversor() {
setSize(300, 200);
setTitle("Conversión de temperaturas");
initComponents();
}

private void initComponents() {


lblGradosC = new javax.swing.JLabel();
txtGradosC = new javax.swing.JTextField();
lblGradosF = new javax.swing.JLabel();
txtGradosF = new javax.swing.JTextField();
btnAceptar = new javax.swing.JButton();
getContentPane().setLayout(null);
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowOpened(java.awt.event.WindowEvent evt) {
formWindowOpened(evt);
}
public void windowClosing(java.awt.event.WindowEvent evt){
exitForm(evt);
}
});
lblGradosC.setText("Grados centígrados");
getContentPane().add(lblGradosC);
lblGradosC.setBounds(12, 28, 116, 16);
txtGradosC.setText("0.00");
txtGradosC.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
// Manejador de eventos asociado a la caja de texto
txtGradosC.addFocusListener(new java.awt.event.FocusAdapter() {
public void focusGained(java.awt.event.FocusEvent evt) {
txtGradosFocusGained(evt);
}
});
txtGradosC.addKeyListener(new java.awt.event.KeyAdapter() {

Ing. Zoraida Yanet Vidal Melgarejo, Mg. -4-


Universidad Nacional de Trujillo Tecnología de la Programación II
Ingeniería de Sistemas Componentes Interfaz Gráfica de Usuario – Parte III

public void keyTyped(java.awt.event.KeyEvent evt) {


txtGradosKeyTyped(evt);
}
});
getContentPane().add(txtGradosC);
txtGradosC.setBounds(132, 28, 144, 20);
lblGradosF.setText("Grados farenheit");
getContentPane().add(lblGradosF);
lblGradosF.setBounds(12, 68, 104, 24);
txtGradosF.setText("32.00");
txtGradosF.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
// Manejador de eventos asociado a la caja de texto
txtGradosF.addFocusListener(new java.awt.event.FocusAdapter() {
public void focusGained(java.awt.event.FocusEvent evt) {
txtGradosFocusGained(evt);
}
});
txtGradosF.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyTyped(java.awt.event.KeyEvent evt) {
txtGradosKeyTyped(evt);
}
});
getContentPane().add(txtGradosF);
txtGradosF.setBounds(132, 72, 144, 20);
btnAceptar.setText("Aceptar");
btnAceptar.setMnemonic('A');
// Manejador de eventos asociado con el botón
btnAceptar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnAceptarActionPerformed(evt);
}
});
// Botón por omisión
getRootPane().setDefaultButton(btnAceptar);
getContentPane().add(btnAceptar);
btnAceptar.setBounds(132, 120, 144, 24);
setLocationRelativeTo(null);
}

private void formWindowOpened(java.awt.event.WindowEvent evt) {


txtGradosC.requestFocus();
}

private void exitForm(java.awt.event.WindowEvent evt) {


System.exit(0);
}

private void txtGradosFocusGained(java.awt.event.FocusEvent evt) {


javax.swing.JTextField objEnfocado = (javax.swing.JTextField)evt.getSource();
// Seleccionar el texto de una caja de texto
objEnfocado.selectAll();
}

private void txtGradosKeyTyped(java.awt.event.KeyEvent evt) {


objTextField = evt.getSource();
}

private void btnAceptarActionPerformed(java.awt.event.ActionEvent evt) {


try {
double grados;

Ing. Zoraida Yanet Vidal Melgarejo, Mg. -5-


Universidad Nacional de Trujillo Tecnología de la Programación II
Ingeniería de Sistemas Componentes Interfaz Gráfica de Usuario – Parte III

// Si se escribió en la caja de texto grados centigrados:


if (objTextField == txtGradosC) {
grados = Double.parseDouble(txtGradosC.getText()) * 9.0 / 5.0 + 32.0;
String texto = String.format("%.2f", grados); // Redondear a 2 decimales
txtGradosF.setText(texto);
}
// Si se escribió en la caja de texto grados farenheit
if (objTextField == txtGradosF) {
grados = (Double.parseDouble(txtGradosF.getText()) - 32.0) * 5.0 / 9.0;
String texto = String.format("%.2f", grados);
txtGradosC.setText(texto);
}
} catch (NumberFormatException e) {
txtGradosC.setText("0.00");
txtGradosF.setText("32.00");
}
}

public static void main(String [] args) {


try {
javax.swing.UIManager.setLookAndFeel(
javax.swing.UIManager.getSystemLookAndFeelClassName());
} catch(Exception ex) {
javax.swing.JOptionPane.showMessageDialog(new FrmConversor(),
"No se pudo establecer el aspecto deseado", "Aviso", 2);
}
new FrmConversor().setVisible(true);
}
}

 Al ejecutar la aplicación, se obtendrá un formulario similar al que se muestra a continuación:

 Un botón por omisión es aquel que tiene un borde más resaltado que los demás y que es
automáticamente pulsado cuando se pulsa la tecla Enter. Para informar al panel raíz del que será el
botón por omisión de entre todo los que contenga, hay que invocar al método setDefaultButton:

 Cuando el usuario escribe en una caja de texto, cada pulsación produce un evento de tipo KeyEvent
que coloca en la cola de mensajes de la aplicación los mensajes keyPressed, keyTyped y
keyReleased. Para interceptar este tipo de eventos, se añade a cada una de las cajas de texto un
manejador de tipo KeyListener. El mensaje que se requiere interceptar es “se ha escrito un carácter:
keyTyped”. El método txtGradosKeyTyped guarda el identificador de la caja de texto en la
variable miembro objTextField, cuyo valor servirá para saber sobre qué caja de texto escribió el
usuario y actualizar a partir de este valor el contenido de la otra.

Ing. Zoraida Yanet Vidal Melgarejo, Mg. -6-


Universidad Nacional de Trujillo Tecnología de la Programación II
Ingeniería de Sistemas Componentes Interfaz Gráfica de Usuario – Parte III

 Una vez que el usuario haya escrito un valor en una caja de texto, su siguiente acción será pulsar la
tecla Enter, o lo que es lo mismo, hará clic en el botón Aceptar. Para que este botón pueda responder
al evento “clic” se le asocia un manejador de eventos de acción, en el método initComponents:

Las acciones que se ejecutarán cuando se haga clic sobre el botón Aceptar, se definen en el método
btnAceptarActionPerformed. Este método tiene que interrogar la variable miembro objTextField para
saber en qué caja de texto introdujo el usuario un nuevo valor y aplicar la fórmula de conversión
adecuada, visualizando el resultado de la conversión en la otra caja.

 Cuando un componente posee el punto de inserción, se dice que dicho componente está enfocado o
que tiene el foco. Para enfocar un componente, el usuario puedo hacer clic sobre él o pulsando la
tecla Tab una o más veces hasta situar el foco sobre él. Para enfocar un componente cuando la
ventana de la aplicación se visualiza, se invoca al método requestFocus:

 En la mayoría de las ocasiones se requiere que el contenido de una caja de texto sea seleccionado
automáticamente cuando recibe el foco. Para ello se asocia a cada caja de texto un manejador de
eventos FocusEvent. Para interceptar este tipo de eventos, se añade a cada caja de texto un
manejador de tipo FocusListener. El mensaje que interesa interceptar es: “foco ganado:
focusGained”. El código se inserta en el método initComponents:

Ing. Zoraida Yanet Vidal Melgarejo, Mg. -7-


Universidad Nacional de Trujillo Tecnología de la Programación II
Ingeniería de Sistemas Componentes Interfaz Gráfica de Usuario – Parte III

Para responder al evento “foco obtenido” (focusGained) se implementa el método


txtGradosFocusGained. Este método obtiene el identificador de la caja de texto que obtiene el foco y
le envía el mensaje selectAll:

3. Manejo de eventos de cajas de texto, etiquetas y botones.


Se desarrollará una aplicación que permita convertir grados Centígrados a Fahrenheit, y viceversa. En este
ejemplo se prescinde del botón Aceptar.

3.1. Agregar una nueva Clase Java: FrmConversor2, en el paquete eventos.

3.2. Escribir el código mostrado a continuación.

package eventos;

public class FrmConversor2 extends javax.swing.JFrame {


private javax.swing.JLabel lblGradosC;
private javax.swing.JTextField txtGradosC;
private javax.swing.JLabel lblGradosF;
private javax.swing.JTextField txtGradosF;

public FrmConversor2() {
setSize(300, 200);
setTitle("Conversión de temperaturas");
initComponents();
}

private void initComponents() {


lblGradosC = new javax.swing.JLabel();
txtGradosC = new javax.swing.JTextField();
lblGradosF = new javax.swing.JLabel();
txtGradosF = new javax.swing.JTextField();
getContentPane().setLayout(null);
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowOpened(java.awt.event.WindowEvent evt) {
formWindowOpened(evt);
}
public void windowClosing(java.awt.event.WindowEvent evt){
exitForm(evt);
}
});
lblGradosC.setText("Grados centígrados");
getContentPane().add(lblGradosC);
lblGradosC.setBounds(12, 28, 116, 16);
txtGradosC.setText("0.00");
txtGradosC.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
// Manejador de eventos asociado a la caja de texto
txtGradosC.addFocusListener(new java.awt.event.FocusAdapter() {

Ing. Zoraida Yanet Vidal Melgarejo, Mg. -8-


Universidad Nacional de Trujillo Tecnología de la Programación II
Ingeniería de Sistemas Componentes Interfaz Gráfica de Usuario – Parte III

public void focusGained(java.awt.event.FocusEvent evt) {


txtGradosFocusGained(evt);
}
});
txtGradosC.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
txtGradosActionPerformed(evt);
}
});
txtGradosC.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyReleased(java.awt.event.KeyEvent evt) {
txtGradosKeyReleased(evt);
}
});
getContentPane().add(txtGradosC);
txtGradosC.setBounds(132, 28, 144, 20);
lblGradosF.setText("Grados farenheit");
getContentPane().add(lblGradosF);
lblGradosF.setBounds(12, 68, 104, 24);
txtGradosF.setText("32.00");
txtGradosF.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
// Manejador de eventos asociado a la caja de texto
txtGradosF.addFocusListener(new java.awt.event.FocusAdapter() {
public void focusGained(java.awt.event.FocusEvent evt) {
txtGradosFocusGained(evt);
}
});
txtGradosF.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
txtGradosActionPerformed(evt);
}
});
txtGradosF.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyReleased(java.awt.event.KeyEvent evt) {
txtGradosKeyReleased(evt);
}
});
getContentPane().add(txtGradosF);
txtGradosF.setBounds(132, 72, 144, 20);
setLocationRelativeTo(null);
}

private void formWindowOpened(java.awt.event.WindowEvent evt) {


txtGradosC.requestFocus();
}

private void exitForm(java.awt.event.WindowEvent evt) {


System.exit(0);
}

private void txtGradosFocusGained(java.awt.event.FocusEvent evt) {


javax.swing.JTextField objEnfocado = (javax.swing.JTextField)evt.getSource();
// Seleccionar el texto de una caja de texto
objEnfocado.selectAll();
}

private void txtGradosActionPerformed(java.awt.event.ActionEvent evt) {


try {
double grados;
String sgrados;

Ing. Zoraida Yanet Vidal Melgarejo, Mg. -9-


Universidad Nacional de Trujillo Tecnología de la Programación II
Ingeniería de Sistemas Componentes Interfaz Gráfica de Usuario – Parte III

Object objTextField = evt.getSource();


// Si se escribió en la caja de texto grados centigrados:
if (objTextField == txtGradosC) {
sgrados = txtGradosC.getText();
if(sgrados.length() == 0)
return; // caja vacía
grados = Double.parseDouble(sgrados) * 9.0 / 5.0 + 32.0;
String texto = String.format("%.2f", grados); // Redondear a 2 decimales
txtGradosF.setText(texto);
}
// Si se escribió en la caja de texto grados farenheit
if (objTextField == txtGradosF) {
sgrados = txtGradosF.getText();
if(sgrados.length() == 0)
return;
grados = (Double.parseDouble(sgrados) - 32.0) * 5.0 / 9.0;
String texto = String.format("%.2f", grados);
txtGradosC.setText(texto);
}
} catch (NumberFormatException e) {
txtGradosC.setText("0.00");
txtGradosF.setText("32.00");
}
}

private void txtGradosKeyReleased(java.awt.event.KeyEvent evt) {


// Obtener la caja de texto que generó el evento
javax.swing.JTextField objTF = (javax.swing.JTextField)evt.getSource();
// fuente: almacena el contenido de la caja de texto
String str = objTF.getText();
char[] fuente = str.toCharArray();
// resultado: almacena el contenido de la caja de texto validado
char[] resultado = new char[fuente.length];
int j=0;
boolean error = false;
// Almacenar en resultado los caracteres válidos de fuente
for(int i=0; i<fuente.length; i++) {
if(fuente[i]>='0' && fuente[i]<='9' || fuente[i]=='.' || fuente[i]=='+' || fuente[i]=='-')
resultado[j++] = fuente[i];
else {
error = true;
java.awt.Toolkit.getDefaultToolkit().beep();
}
}
if(error)
objTF.setText(new String(resultado, 0, j));
}

public static void main(String [] args) {


try {
javax.swing.UIManager.setLookAndFeel(
javax.swing.UIManager.getSystemLookAndFeelClassName());
} catch(Exception ex) {
javax.swing.JOptionPane.showMessageDialog(new FrmConversor(),
"No se pudo establecer el aspecto deseado", "Aviso", 2);
}
new FrmConversor2().setVisible(true);
}
}

Ing. Zoraida Yanet Vidal Melgarejo, Mg. - 10 -


Universidad Nacional de Trujillo Tecnología de la Programación II
Ingeniería de Sistemas Componentes Interfaz Gráfica de Usuario – Parte III

 Al ejecutar la aplicación, se obtendrá un formulario similar al que se muestra a continuación:

 En este nuevo diseño, luego de que el usuario modifica el contenido de una caja de texto y pulsa la
tecla Enter, se realiza el cálculo de la conversión y se actualiza la otra caja de texto. Para interceptar
la tecla Enter, se asocia un manejador de tipo ActionListener con el componente de texto que
recibe tal evento. En el método initComponents se encuentra el código:

Para responder al mensaje “se pulsó la tecla Enter“ se implementa el método


txtGradosActionPerformed:

Ing. Zoraida Yanet Vidal Melgarejo, Mg. - 11 -


Universidad Nacional de Trujillo Tecnología de la Programación II
Ingeniería de Sistemas Componentes Interfaz Gráfica de Usuario – Parte III

 Validar un campo de texto equivale a restringir su contenido al conjunto de caracteres válidos para
dicho campo. Si la validación de los datos se hace después de pulsar la tecla Enter en el componente
de texto (se produce el evento de acción ActionEvent), el campo podría contener datos no válidos,
aunque podrían ser validados antes de utilizarlos. En cambio si la validación se hace verificando la
validez de cada tecla pulsada (se genera un evento de pulsación KeyEvent), el campo de texto ya
estará validado una vez finalizado el ingreso de datos.
Cuando un componente de texto tiene el foco y el usuario pulsa una tecla se generan tres mensajes:
keyPressed (cuando se pulsa la tecla), keyTyped (cuando se escribe el carácter) y keyReleased
(cuando se suelta la tecla). Para que el componente responda deberá tener asociado un manejador de
eventos de tipo KeyListener, o lo que es lo mismo, de tipo KeyAdapter.

En esta aplicación se considera que el contenido de las cajas de texto será válido cuando sus
caracteres pertenezcan al siguiente conjunto: +-.1234567890. El signo + o – sólo puede aparecer al
principio del dato y éste sólo puede contener un punto decimal.
Para responder al evento “se soltó la tecla: keyReleased” se implementa el método
txtGradosKeyReleased, donde por cada pulsación:
- Obtiene el contenido actual de la caja de texto que genera el mensaje keyReleased.
- Lo almacena en una matriz de caracteres denominada fuente.
- Aplicando las reglas enunciadas en el párrafo previo, copia los caracteres válidos en otra matriz
denominada resultado.
- Reemplaza el contenido de la caja de texto con el contenido de resultado, sólo si algún carácter de
fuente no fue válido.

Ing. Zoraida Yanet Vidal Melgarejo, Mg. - 12 -


Universidad Nacional de Trujillo Tecnología de la Programación II
Ingeniería de Sistemas Componentes Interfaz Gráfica de Usuario – Parte III

 El método getDefaultToolkit devuelve un objeto de una subclase de java.awt.Toolkit que es


utilizado para invocar al método beep. Cuando este método se ejecuta, se emite un pitido.

4. Manejo de eventos de cajas de texto, etiquetas y botones.


Se desarrollará una aplicación que permita convertir grados Centígrados a Fahrenheit, y viceversa. La
validación de las cajas de texto se realiza con un documento asociado.

Los componentes Swing están basados en la arquitectura modelo-vista-controlador. En el caso de los campos de
texto, el modelo está definido por el documento de texto, la vista se refiere a cualquier perspectiva de ese
modelo y el controlador se corresponde con los manejadores de eventos.
Según esta arquitectura, para crear un campo validado hay que interceptar cada pulsación antes de que el
carácter sea insertado en el modelo, con el fin de insertar sólo los caracteres válidos. De esta forma la vista
nunca podrá mostrar datos no válidos.
El modelo (contenedor de texto) de un componente de texto es un objeto que implementa la interfaz
Document. En el nivel más elemental, el texto es modelado como una secuencia lineal de caracteres. Este
modelo es creado por el método createDefaultModel de JTextField cada vez que se crea un objeto de
esta clase.

4.1. Agregar una nueva Clase Java: JTextFieldDouble, en el paquete eventos.

4.2. Escribir el código mostrado a continuación.

package eventos;

public class JTextFieldDouble extends javax.swing.JTextField {

protected javax.swing.text.Document createDefaultModel() {


return new PlainDocumentDouble();
}

protected class PlainDocumentDouble extends javax.swing.text.PlainDocument {

public void insertString(int offs, String str, javax.swing.text.AttributeSet a)


throws javax.swing.text.BadLocationException {
// fuente: almacena el contenido de la caja de texto
char[] fuente = str.toCharArray();
// resultado: almacena el contenido de la caja de texto validado
char[] resultado = new char[fuente.length];
int j = 0;
// Almacenar en resultado los caracteres válidos de fuente
for (int i = 0; i < fuente.length; i++) {
if (fuente[i] >= '0' && fuente[i] <= '9' || fuente[i] == '.' || fuente[i] == '+' || fuente[i] == '-' ||
fuente[i] == ',') {
resultado[j++] = fuente[i];
} else {
java.awt.Toolkit.getDefaultToolkit().beep();
}
}
super.insertString(offs, new String(resultado, 0, j), a);
}
}
}

 El método createDefaultModel retorna de forma predeterminada un objeto


javax.swing.text.PlainDocument que se corresponde con el contenedor de texto; esto es, con el
modelo. Cada vez que se cree un objeto de la clase JTextFieldDouble, createDefaultModel creará el

Ing. Zoraida Yanet Vidal Melgarejo, Mg. - 13 -


Universidad Nacional de Trujillo Tecnología de la Programación II
Ingeniería de Sistemas Componentes Interfaz Gráfica de Usuario – Parte III

modelo asociado con dicho objeto, que como se puede observar, será un objeto de la clase
PlainDocumentDouble.
La clase PlainDocumentDouble crea el contenedor de texto (el modelo). Esta clase hereda un método
llamado insertString que será invocado de forma automática por un objeto JTextFieldDouble cada
vez que haya que insertar un carácter en el contenedor de texto (porque el usuario pulsó una tecla), o
una cadena de caracteres (porque se invocó al método setText). Este método ha sido implementado
para que antes de insertar el carácter o la cadena de caracteres en el modelo, valide esta información.
Una vez realizada la validación, el método insertString de la clase JTextFieldDouble se limitará a llamar
al método insertString de la clase padre pasándole como argumento la información validada para
que sea insertada en el modelo y visualizada en la vista del objeto JTextFieldDouble.

4.3. Agregar una nueva Clase Java: FrmConversor3, en el paquete eventos.

4.4. Escribir el código mostrado a continuación.

package eventos;

public class FrmConversor3 extends javax.swing.JFrame {


rivate javax.swing.JLabel lblGradosC;
rivate JTextFieldDouble txtGradosC;
rivate javax.swing.JLabel lblGradosF;
rivate JTextFieldDouble txtGradosF;

ublic FrmConversor3() {
setSize(300, 200);
setTitle("Conversión de temperaturas");
initComponents();
}

private void initComponents() {


lblGradosC = new javax.swing.JLabel();
txtGradosC = new JTextFieldDouble();
lblGradosF = new javax.swing.JLabel();
txtGradosF = new JTextFieldDouble();
getContentPane().setLayout(null);
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowOpened(java.awt.event.WindowEvent evt) {
formWindowOpened(evt);
}
public void windowClosing(java.awt.event.WindowEvent evt){
exitForm(evt);
}
});
lblGradosC.setText("Grados Centígrados");
getContentPane().add(lblGradosC);
lblGradosC.setBounds(12, 28, 116, 16);
txtGradosC.setText("0.00");
txtGradosC.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
// Manejador de eventos asociado a la caja de texto
txtGradosC.addFocusListener(new java.awt.event.FocusAdapter() {
public void focusGained(java.awt.event.FocusEvent evt) {
txtGradosFocusGained(evt);
}
});
txtGradosC.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
txtGradosActionPerformed(evt);
}
});

Ing. Zoraida Yanet Vidal Melgarejo, Mg. - 14 -


Universidad Nacional de Trujillo Tecnología de la Programación II
Ingeniería de Sistemas Componentes Interfaz Gráfica de Usuario – Parte III

getContentPane().add(txtGradosC);
txtGradosC.setBounds(132, 28, 144, 20);
lblGradosF.setText("Grados Farenheit");
getContentPane().add(lblGradosF);
lblGradosF.setBounds(12, 68, 104, 24);
txtGradosF.setText("32.00");
txtGradosF.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
// Manejador de eventos asociado a la caja de texto
txtGradosF.addFocusListener(new java.awt.event.FocusAdapter() {
public void focusGained(java.awt.event.FocusEvent evt) {
txtGradosFocusGained(evt);
}
});
txtGradosF.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
txtGradosActionPerformed(evt);
}
});
getContentPane().add(txtGradosF);
txtGradosF.setBounds(132, 72, 144, 20);
setLocationRelativeTo(null);
}

private void formWindowOpened(java.awt.event.WindowEvent evt) {


txtGradosC.requestFocus();
}

private void exitForm(java.awt.event.WindowEvent evt) {


System.exit(0);
}

private void txtGradosFocusGained(java.awt.event.FocusEvent evt) {


javax.swing.JTextField objEnfocado = (javax.swing.JTextField)evt.getSource();
// Seleccionar el texto de una caja de texto
objEnfocado.selectAll();
}

private void txtGradosActionPerformed(java.awt.event.ActionEvent evt) {


try {
double grados;
String sgrados;
Object objTextField = evt.getSource();
// Si se escribió en la caja de texto grados centigrados:
if (objTextField == txtGradosC) {
sgrados = txtGradosC.getText();
if(sgrados.length() == 0)
return; // caja vacía
grados = Double.parseDouble(sgrados) * 9.0 / 5.0 + 32.0;
String texto = String.format("%.2f", grados); // Redondear a 2 decimales
txtGradosF.setText(texto);
}
// Si se escribió en la caja de texto grados farenheit
if (objTextField == txtGradosF) {
sgrados = txtGradosF.getText();
if(sgrados.length() == 0)
return;
grados = (Double.parseDouble(sgrados) - 32.0) * 5.0 / 9.0;
String texto = String.format("%.2f", grados);
txtGradosC.setText(texto);
}

Ing. Zoraida Yanet Vidal Melgarejo, Mg. - 15 -


Universidad Nacional de Trujillo Tecnología de la Programación II
Ingeniería de Sistemas Componentes Interfaz Gráfica de Usuario – Parte III

} catch (NumberFormatException e) {
txtGradosC.setText("0.00");
txtGradosF.setText("32.00");
}
}

public static void main(String [] args) {


try {
javax.swing.UIManager.setLookAndFeel(
javax.swing.UIManager.getSystemLookAndFeelClassName());
} catch(Exception ex) {
javax.swing.JOptionPane.showMessageDialog(new FrmConversor3(),
"No se pudo establecer el aspecto deseado", "Aviso", 2);
}
new FrmConversor3().setVisible(true);
}
}

Ing. Zoraida Yanet Vidal Melgarejo, Mg. - 16 -

Potrebbero piacerti anche