Hola a todos. Me gustaría que me ayudarán con la siguiente aplicación. La misma, que está escrita en netbeans 6.9, es ejecutada casi a la perfección. Estoy utilizando dos clases internas como manejadores de eventos (ActionListener), la primera me funciona a la perfección, no entando la segunda, me funciona parcialmente. Deseo, si así es el caso, si el usuario decide continuar con la ejecución de los cálculos, la aplicación vuelva a iniciarse. (Véase el conjunto de sentencias resaltadas en rojo).
El código es el siguiente:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.text.DecimalFormat;
public class Aplicacion_01 extends JFrame { //implements ActionListener {
private JLabel alturaEtiqueta, // etiqueta para alturaEntrada
pesoEtiqueta, // etiqueta para pesoEntrada
IMCEtiqueta, // etiqueta para mostrar el IMC
infrapeso, // etiqueta para indicar anorexia
bajopeso1, // etiqueta para indicar delgadez moderada.
bajopeso2, // etiqueta para indicar delgadez aceptada.
normal, // etiqueta para indicar pesona normal.
preobeso, // etiqueta para indicar pesona obesita
obeso1, // etiqueta para indicar pesona obesa.
obeso2, // etiqueta para indicar pesona pasada.
obeso3, // etiqueta para indicar pesona pasada.
seguir; // etiqueta para continuar o no.
private JTextField alturaEntrada, // tomar la altura del usuario
pesoEntrada; // tomar el peso del usuario
private JButton calcularBoton, // el usuario pulsa este botón
Si, // etiqueta que permite continuar.
No; // etiqueta que permite salir.
private JPanel Continuar, Boton;
Container contenidoBoton = getContentPane();
public Aplicacion_01() {
// Procede a delimitar el marco.
setTitle("Determinación del ìndice corporal.");
setLayout(new FlowLayout()); // establece el esquema del marco.
contenidoBoton.setBackground(Color.white);
setSize(400,220);
setLocationRelativeTo(null);
// Comienza a crear las ventanas.
alturaEtiqueta = new JLabel("Su altura (en metros, p.e. 1.88):");
alturaEntrada = new JTextField(5);
pesoEtiqueta = new JLabel(" Su peso (en kilogramos, p.e. 180.5):");
pesoEntrada = new JTextField(5);
calcularBoton = new JButton(" Calcula el IMC ");
calcularBoton.setBackground(Color.BLUE);
calcularBoton.setForeground(Color.YELLOW);
IMCEtiqueta = new JLabel("Este es su IMC:");
IMCEtiqueta.setForeground(Color.MAGENTA);
// Identifica los diversos aspectos de las caracterìsticas de una persona.
infrapeso = new JLabel();
infrapeso.setText("Usted se encuentra en estado anoréxico.");
infrapeso.setForeground(Color.darkGray);
bajopeso1 = new JLabel();
bajopeso1.setText("Usted se encuentra en estado delgadez moderada.");
bajopeso1.setForeground(Color.red);
bajopeso2 = new JLabel();
bajopeso2.setText("Usted se encuentra en estado delgadez aceptable.");
bajopeso2.setForeground(Color.yellow);
normal = new JLabel();
normal.setText("Usted se encuentra bajo un peso normal.");
normal.setForeground(Color.blue);
preobeso = new JLabel();
preobeso.setText("Usted se encuentra un poco gordito(a).");
preobeso.setForeground(Color.orange);
obeso1 = new JLabel();
obeso1.setText("Usted se encuentra un poco obeso(a).");
obeso1.setForeground(Color.magenta);
obeso2 = new JLabel();
obeso2.setText("Usted se encuentra en estado de obesidad.");
obeso2.setForeground(Color.red);
obeso3 = new JLabel();
obeso3.setText("Usted se encuentra en estado de obesidad extrema.");
obeso3.setForeground(Color.darkGray);
// Añade las diversas etiquetas.
add(alturaEtiqueta);
alturaEntrada.setBorder(BorderFactory.createLineBorder(Color.blue,2));
add(alturaEntrada);
add(pesoEtiqueta);
pesoEntrada.setBorder(BorderFactory.createLineBorder(Color.blue,2));
add(pesoEntrada);
add(calcularBoton);
add(IMCEtiqueta);
Calculo calcular = new Calculo();
calcularBoton.addActionListener(calcular);
} // cierre del constructor Aplicacion_01.
public static void main(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(true);
JDialog.setDefaultLookAndFeelDecorated(true);
Aplicacion_01 figura = new Aplicacion_01();
JOptionPane.showMessageDialog(null, "Esta aplicación muestra el" +
"índice corporal de una persona así n" +
" como su estado físico actual.", "Objetivo",
JOptionPane.INFORMATION_MESSAGE);
figura.setVisible(true);
figura.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} // cierre del método main.
private class Calculo implements ActionListener { /* Clase interna para manejar
* eventos de botón. */
public void actionPerformed(ActionEvent evento) { /* Maneja eventos de
* botón. */
DecimalFormat digitos = new DecimalFormat("0.00");
String alturaCadena, pesoCadena, resultado, bajopeso;
double peso, altura;
double imc;
// obtener valores de entrada
alturaCadena = alturaEntrada.getText();
pesoCadena = pesoEntrada.getText();
// convertir la entrada a números
altura = convertirAdouble(alturaCadena);
peso = convertirAdouble(pesoCadena);
// calcular el IMC
imc = calcularIMC(altura, peso);
// mostrar el resultado
resultado = "Su IMC es: " +digitos.format(imc);
IMCEtiqueta.setText(resultado);
// Establece las diversas condiciones de la persona.
if(imc < 16.00) {
add(infrapeso);
continuacion();
}
if(imc < 17.00 && imc >= 16.00) {
add(bajopeso1);
continuacion();
}
if(imc < 18.49 && imc >= 17.00) {
add(bajopeso2);
continuacion();
}
if(imc < 24.99 && imc >= 18.50) {
add(normal);
continuacion();
}
if(imc < 29.99 && imc >= 25.00) {
add(preobeso);
continuacion();
}
if(imc < 34.99 && imc >= 30.00) {
add(obeso1);
continuacion();
}
if(imc < 39.99 && imc >= 35.00) {
add(obeso2);
continuacion();
}
if(imc >= 40.00) {
add(obeso3);
continuacion();
}
} // cierre del método interno actionPerformed.
} // cierre de la clase interna Calculo.
private double convertirAdouble(String cad) {
Double objetoDouble = new Double(cad);
return objetoDouble.doubleValue();
} // cierre del método convertirAdouble.
private double calcularIMC(double altura, double peso) {
double imc;
imc = peso/Math.pow(altura,2);
return imc;
} // cierre del método calcularIMC.
void continuacion() {
Continuar = new JPanel(new BorderLayout());
Boton = new JPanel();
Si = new JButton("Si");
No = new JButton("No");
Si.setBackground(new Color(0,255,31,150));
Si.setForeground(new Color(255,0,0));
No.setBackground(new Color(0,255,31,150));
No.setForeground(new Color(255,0,0));
seguir = new JLabel();
seguir.setText("¿Desea seguir calculando?");
Boton.add(Si);
Boton.add(No);
ControlBoton control = new ControlBoton();
Si.addActionListener(control);
No.addActionListener(control);
add(seguir);
contenidoBoton.add(Continuar);
Continuar.add(Boton, BorderLayout.SOUTH);
} // cierre del método continuacion.
private class ControlBoton implements ActionListener {
public void actionPerformed(ActionEvent evento) {
if(evento.getSource() == Si) {
evento.getActionCommand();
new Aplicacion_01();
} else if (evento.getSource() == No) {
evento.getActionCommand();
salida();
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
}// cierre del método actionPerformed.
} // cierre de la clase interna privada ControlBoton.void salida() {
JDialog.setDefaultLookAndFeelDecorated(true);
JOptionPane.showMessageDialog(null, "Ha sido un placer haber " +
"trabajado con usted. Hasta luego...", "Salida",
JOptionPane.INFORMATION_MESSAGE);
} // cierre del método salida.
} // cierre de la clase Aplicacion_01.
Me podrían indicar y corregir de ser posible en donde consiste mi falla.
LEs agradezco de antemano, cualquier ayuda brindada