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
(http://s2.subirimagenes.com/fotos/previo/thump_8280531foto1.png) (http://www.subirimagenes.com/fotos-foto1-8280531.html)
Este error ocurre cuando se hace Click en calcular sin haber elegido el tipo de numero a convertir
(http://s2.subirimagenes.com/fotos/previo/thump_8280535foto2.png) (http://www.subirimagenes.com/fotos-foto2-8280535.html)
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
(http://s2.subirimagenes.com/fotos/previo/thump_8280538foto3.png) (http://www.subirimagenes.com/fotos-foto3-8280538.html)
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 Convertidorimport 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 boolean esBinario;
private boolean esHexadecimal;
private int numeroDecimal;
public Convertidor() {
super("Convertidor");
//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
campo2.setEditable(false);
//Se crean los botones de Radio y uno normal
botonCalcular
= new JButton("Calcular");
//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.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);
}
/**
* 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
*/
if(campo1.getText().equals("")) {
JOptionPane.
showMessageDialog(null,
"No ha ingresado ningun numero",
"ERROR",
0); } else {
try {
numeroDecimal
= Integer.
parseInt(campo1.
getText()); 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
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.