Ayuda con Eventos y libreria Swing

Iniciado por DarkSorcerer, 5 Febrero 2013, 01:33 AM

0 Miembros y 1 Visitante están viendo este tema.

DarkSorcerer

Hola, necesito ayuda con eventos, para ejercitar lo aprendido, me decidí programar un conversor de numeros, es decir, el usuario escribe un numero en el campo, despues selecciona en un boton de radio si quiere convertirlo a binario o hexadecimal, si no lo escogio arrojará un mensaje de que seleccione el tipo de numero a convertir, pero el problema que me da es cuando el usuario apreta el boton "Calcular" sin que haya un numero en el campo y se me cae el programa, pese a que programe a que el sistema desplegara un mensaje cuando no ingreso un numero, pero no me hace caso

Les dejo mi codigo y algunas imagenes, ojala me puedan ayudar ya que soy nuevo en esto, por el momento me calcula bien a binario y hexadecimal por que lo comprobe, pero el problema es cuando ejecuto el boton Calcular sin que haya numero y deberia avisar por mensaje de que se debe ingresar un numero

Cualquier recomendacion o correccion de algun errores que haya cometido, bienvenido sean, o si hay una forma mas corta, tambien, asi ganamos todos en este tema xD

Clase Convertidor
[/b]

package ejercicio117;

//Se importa las las clases necesarias para el convertidor

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JRadioButton;
import javax.swing.ButtonGroup;
import javax.swing.JOptionPane;
import java.awt.FlowLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;

public class Convertidor extends JFrame {
   
    //Declaracion de variables
   
    private JLabel etiqueta1;
    private JLabel etiqueta2;
    private JTextField campo1;
    private JTextField campo2;
    private JButton botonCalcular;
    private JRadioButton botonBinario;
    private JRadioButton botonHexadecimal;
    private ButtonGroup grupoBotones;
    private boolean esBinario;
    private boolean esHexadecimal;
    private int numeroDecimal;
   
    public Convertidor(){
       
        super("Convertidor");
        setLayout(new FlowLayout());
       
        //Se crean las etiquetas
       
        etiqueta1 = new JLabel("Numero a convertir");
        etiqueta2 = new JLabel("Numero convertido ");
       
        //Se crean los campos, el primero para ingresar y el otro para imprimir
       
        campo1 = new JTextField(10);
        campo2 = new JTextField(10);
        campo2.setEditable(false);
       
        //Se crean los botones de Radio y uno normal
       
        botonCalcular = new JButton("Calcular");
        botonBinario = new JRadioButton("Binario");
        botonHexadecimal = new JRadioButton("Hexadecimal");
       
        //Se crean booleanos necesarios para determinar el tipo de numero a convertir
       
        esBinario = false;
        esHexadecimal = false;
        numeroDecimal = 0;
       
        //Se crea el grupo de botones de radio y se agregan los botones radio a
        //dicho grupo
       
        grupoBotones = new ButtonGroup();
        grupoBotones.add(botonCalcular);
        grupoBotones.add(botonBinario);
        grupoBotones.add(botonHexadecimal);
       
       
        //Se agregan las etiquetas, campos y botones a la ventana
       
        add(etiqueta1);
        add(campo1);
       
        add(etiqueta2);
        add(campo2);
       
        add(botonBinario);
        add(botonHexadecimal);
        add(botonCalcular);
       
        //Se crea instancia AdministradorEventos para controlar los eventos
       
        AdministradorEventos administrador = new AdministradorEventos();
       
        //Se le agregan eventos a los botones a utilizar
       
        botonBinario.addItemListener(administrador);
        botonHexadecimal.addItemListener(administrador);
        botonCalcular.addActionListener(administrador);
       
    }
   
    private class AdministradorEventos implements ActionListener, ItemListener {
       
        /**
         *
         * Metodo que permite calcular el numero numero decimal a binario, hexade
         * cimal o viceversa, segun lo que se haya seleccionado en los botones
         * de radio
         *
         */
       
        public void actionPerformed(ActionEvent evento){
           
            if(esBinario){
               
                if(campo1.getText() == null){
                   
                    JOptionPane.showMessageDialog(null, "No ha ingresado ningun numero", "ERROR", 0);
                   
                }else{
                   
                    numeroDecimal = Integer.parseInt(campo1.getText());
                    String binario = "";
                   
                    while(numeroDecimal != 0){
                       
                        binario += numeroDecimal%2; //Se concatena
                        numeroDecimal = numeroDecimal / 2;
                       
                    }
                   
                    char arregloChar[] = binario.toCharArray();
                    binario = "";
                   
                    for(int i=0; i<arregloChar.length; i++){
                       
                        binario += arregloChar[(arregloChar.length-1)-i];
                       
                    }
                   
                    campo2.setText(binario);
                }
               
            }else{
               
                if(esHexadecimal){
                   
                    if(campo1.getText() == null){
                       
                        JOptionPane.showMessageDialog(null, "No ha ingresado ningun numero", "ERROR", 0);
                       
                    }else{
                       
                       
                        numeroDecimal = Integer.parseInt(campo1.getText());
                        String hexadecimal = "";
                        int resto = 0;
                       
                        while(numeroDecimal != 0){
                           
                            resto = numeroDecimal % 16;
                           
                            switch(resto){
                               
                                case 10:
                                   
                                    hexadecimal += "A";
                                    break;
                                   
                                case 11:
                                   
                                    hexadecimal += "B";
                                    break;
                                   
                                case 12:
                                   
                                    hexadecimal += "C";
                                    break;
                                   
                                case 13:
                                   
                                    hexadecimal += "D";
                                    break;
                                   
                                case 14:
                                   
                                    hexadecimal += "E";
                                    break;
                                   
                                case 15:
                                   
                                    hexadecimal += "F";
                                    break;
                                   
                                default:
                                   
                                    hexadecimal += resto;
                                    break;
           
                            }//Fin del Switch
                           
                            numeroDecimal = numeroDecimal / 16;
                            System.out.println(numeroDecimal);
                           
                        }//Fin del ciclo While
                       
                        char arregloChar[] = hexadecimal.toCharArray();
                        hexadecimal = "";
                       
                        for(int i=0; i<arregloChar.length; i++){
                           
                            hexadecimal += arregloChar[(arregloChar.length-1)-i];
                           
                        }
                       
                        campo2.setText(hexadecimal);
                    }
                   
                   
                   
                }else{
                   
                    JOptionPane.showMessageDialog(null,"Seleccione el tipo de numero a convertir","Error", 0);
                   
                }
            }
           
        }
       
        /**
         * Metodo que permite seleccionar el tipo de numero a convertir
         */
       
        public void itemStateChanged(ItemEvent evento){
           
            if(botonBinario.isSelected()){
               
                esBinario = true;
                esHexadecimal = false;
               
            }
           
            if(botonHexadecimal.isSelected()){
               
                esBinario = false;
                esHexadecimal = true;
               
            }
           
        }
       
    }
   
}


Programa principal
[/b]

package ejercicio117;

public class Ejercicio117 {

    public static void main(String[] args) {
       
        Convertidor convertidor = new Convertidor();
       
        convertidor.setSize(250,150);
        convertidor.setDefaultCloseOperation(Convertidor.EXIT_ON_CLOSE);
        convertidor.setResizable(false);
        convertidor.setVisible(true);
       
    }
}


Esta es la vista normal del programa

Este error ocurre cuando se hace Click en calcular sin haber elegido el tipo de numero a convertir

Este error se produce cuando no hay un numero en el campo una vez que se selecciono el tipo de numero a convertir, yo esperaba que lanzara el mensaje que diga al usuario ingresar un numero

Slider324

ok te dire el error y la solucion lineas 109 y 141:

if(campo1.getText() == null)

cambialo por:

if(campo1.getText().toString().length() == 0)

para que entiendas un poco mas tu problema intenta con un system.out.println imprimir:

campo1.getText()

saludos y suerte

satu

Buenas!!

También podrías controlar que solo acepte números.

He modificado algunas cosillas para acortar el código y que solo convierta números. No sé mucho de Java, pero es un buen ejemplo para practicar:

Clase Convertidor
Código (java) [Seleccionar]
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JRadioButton;
import javax.swing.JTextField;

public class Convertidor extends JFrame {
    //Declaracion de variables
    private static final long serialVersionUID = 1L;
    private JLabel etiqueta1;
    private JLabel etiqueta2;
    private JTextField campo1;
    private JTextField campo2;
    private JButton botonCalcular;
    private JRadioButton botonBinario;
    private JRadioButton botonHexadecimal;
    private ButtonGroup grupoBotones;
    private boolean esBinario;
    private boolean esHexadecimal;
    private int numeroDecimal;
   
    public Convertidor() {
        super("Convertidor");
        setLayout(new FlowLayout());
       
        //Se crean las etiquetas
        etiqueta1 = new JLabel("Numero a convertir");
        etiqueta2 = new JLabel("Numero convertido ");
       
        //Se crean los campos, el primero para ingresar y el otro para imprimir
        campo1 = new JTextField(10);
        campo2 = new JTextField(10);
        campo2.setEditable(false);
       
        //Se crean los botones de Radio y uno normal
        botonCalcular = new JButton("Calcular");
        botonBinario = new JRadioButton("Binario");
        botonHexadecimal = new JRadioButton("Hexadecimal");
       
        //Se crean booleanos necesarios para determinar el tipo de numero a convertir
        esBinario = false;
        esHexadecimal = false;
        numeroDecimal = 0;
       
        //Se crea el grupo de botones de radio y se agregan los botones radio a
        //dicho grupo
        grupoBotones = new ButtonGroup();
        grupoBotones.add(botonCalcular);
        grupoBotones.add(botonBinario);
        grupoBotones.add(botonHexadecimal);
       
       
        //Se agregan las etiquetas, campos y botones a la ventana
        add(etiqueta1);
        add(campo1);
       
        add(etiqueta2);
        add(campo2);
       
        add(botonBinario);
        add(botonHexadecimal);
        add(botonCalcular);
       
        //Se crea instancia AdministradorEventos para controlar los eventos
        AdministradorEventos administrador = new AdministradorEventos();
       
        //Se le agregan eventos a los botones a utilizar
        botonBinario.addItemListener(administrador);
        botonHexadecimal.addItemListener(administrador);
        botonCalcular.addActionListener(administrador);
    }
   
    private class AdministradorEventos implements ActionListener, ItemListener {
       
        /**
         * Metodo que permite calcular el numero numero decimal a binario, hexade
         * cimal o viceversa, segun lo que se haya seleccionado en los botones
         * de radio
         */
        public void actionPerformed(ActionEvent evento) {
        String resultado = "";
            if(campo1.getText().equals("")) {
                JOptionPane.showMessageDialog(null, "No ha ingresado ningun numero", "ERROR", 0);
            } else {
            try {
            numeroDecimal = Integer.parseInt(campo1.getText());
                } catch(Exception e) {
                JOptionPane.showMessageDialog(null, "Solo números, por favor", "ERROR", 0);
                numeroDecimal = 0;
                }
            if(esBinario) {
            while(numeroDecimal != 0) {
            resultado += numeroDecimal % 2; //Se concatena
            numeroDecimal /= 2;
            }
            char arregloChar[] = resultado.toCharArray();
            resultado = "";
            for(int i = 0; i < arregloChar.length; i++) {
            resultado += arregloChar[(arregloChar.length-1)-i];
            }
                    campo2.setText(resultado);
            } else if(esHexadecimal) {
                    int resto = 0;
                    while(numeroDecimal != 0) {
                        resto = numeroDecimal % 16;
                        switch(resto) {
                            case 10:
                            resultado += "A";
                                break;
                            case 11:
                            resultado += "B";
                                break;
                            case 12:
                            resultado += "C";
                                break;
                            case 13:
                            resultado += "D";
                                break;
                            case 14:
                            resultado += "E";
                                break;
                            case 15:
                            resultado += "F";
                                break;
                            default:
                            resultado += resto;
                                break;
                        }//Fin del Switch
                        numeroDecimal = numeroDecimal / 16;
                        System.out.println(numeroDecimal);
                    }//Fin del ciclo While
                    char arregloChar[] = resultado.toCharArray();
                    resultado = "";
                    for(int i = 0; i < arregloChar.length; i++) {
                    resultado += arregloChar[(arregloChar.length-1)-i];
                    }
                    campo2.setText(resultado);
            } else {
            JOptionPane.showMessageDialog(null,"Seleccione el tipo de numero a convertir","Error", 0);
            }
            }
        }
       
        /**
         * Metodo que permite seleccionar el tipo de numero a convertir
         */
        public void itemStateChanged(ItemEvent evento) {
            if(botonBinario.isSelected()) {
                esBinario = true;
                esHexadecimal = false;
            } else if(botonHexadecimal.isSelected()) {
                esBinario = false;
                esHexadecimal = true;
            }
        }
    }
}


Saludos
Breakbeat como forma de vida

DarkSorcerer

Gracias por sus ayudas, me sirvió, ahora el programa funciona sin problemas, y acerca del manejo de las excepciones, lo tendré en cuenta para que mis programas sean mas robustos.