Foros del Web » Programación para mayores de 30 ;) » Java »

Duda con un array de tipo JTextField

Estas en el tema de Duda con un array de tipo JTextField en el foro de Java en Foros del Web. Hola a todos, he empezado no hace mucho con esto de programar en java y leyendo un código me ha surgido una duda. El código ...
  #1 (permalink)  
Antiguo 15/03/2016, 10:36
 
Fecha de Ingreso: marzo-2016
Mensajes: 3
Antigüedad: 8 años, 8 meses
Puntos: 0
Pregunta Duda con un array de tipo JTextField

Hola a todos, he empezado no hace mucho con esto de programar en java y leyendo un código me ha surgido una duda. El código trata de generar 6 números, ya sea de manera manual o de manera automática. Y si es automática, van a ser números del 1 al 50 y no se pueden repetir entre ellos. Entonces tengo para ellos se crean dos clases, la primera clase se llama Prueba,y alberga la interfaz gráfica del programa.

Código Java:
Ver original
  1. import java.awt.*;
  2. import javax.swing.*;
  3.  
  4. public class Prueba extends JFrame {
  5.     PruebaEventos primi = new PruebaEventos(this);
  6.     // configurar fila 1
  7.     JPanel fila1 = new JPanel();
  8.     ButtonGroup opcion = new ButtonGroup();
  9.     JCheckBox automatico = new JCheckBox("Automático", false);
  10.     JCheckBox manual = new JCheckBox("Manual", true);
  11.     // configurar fila 2
  12.     JPanel fila2 = new JPanel();
  13.     JLabel etiquetaNumeros = new JLabel("Tus Elecciones: ", JLabel.RIGHT);
  14.     JTextField[] numeros = new JTextField[6];
  15.     public Prueba() {
  16.         super("Numeros aleatorios");
  17.         setSize(750, 270);
  18.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  19.         GridLayout layout = new GridLayout(3, 1, 10, 10);
  20.         setLayout(layout);
  21.         automatico.addItemListener(primi);
  22.         manual.addItemListener(primi);
  23.        
  24.         FlowLayout layout1 = new FlowLayout(FlowLayout.CENTER,
  25.         10, 10);
  26.         opcion.add(automatico);
  27.         opcion.add(manual);
  28.         fila1.setLayout(layout1);
  29.         fila1.add(automatico);
  30.         fila1.add(manual);
  31.         add(fila1);
  32.        
  33.        
  34.         GridLayout layout2 = new GridLayout(1, 7, 10, 10);
  35.         fila2.setLayout(layout2);
  36.         fila2.add(etiquetaNumeros);
  37.         for (int i = 0; i < 6; i++) {
  38.             numeros[i] = new JTextField();
  39.             fila2.add(numeros[i]);
  40.         }
  41.         add(fila2);
  42.        
  43.        
  44.         setVisible(true);
  45.     }
  46.     public static void main(String[] arguments) {
  47.         Prueba marco = new Prueba();
  48.     }
  49. }

Y la segunda clase es la que va a albergar la interfaz ItemListener para saber que casilla se ha marcado, si la que pone "automático" o "manual".

Código Java:
Ver original
  1. import javax.swing.*;
  2. import java.awt.event.*;
  3.  
  4. public class PruebaEventos implements ItemListener{
  5.     Prueba gui;
  6.      public PruebaEventos(Prueba in) {
  7.         gui = in;
  8.     }
  9.      
  10.       public void itemStateChanged(ItemEvent event) {
  11.        
  12.         Object item = event.getItem();
  13.         if (item == gui.automatico) {
  14.             for (int i = 0; i < 6; i++) {
  15.                 int eleccion;
  16.                 do {
  17.                     eleccion = (int) Math.floor(Math.random() * 50 + 1);
  18.                 } while (numeroRepetido(eleccion, gui.numeros, i));
  19.                 gui.numeros[i].setText("" + eleccion);
  20.             }
  21.        
  22.         } else {
  23.             for (int i = 0; i < 6; i++) {
  24.                 gui.numeros[i].setText(null);
  25.             }
  26.         }
  27.     }
  28.      
  29.       boolean numeroRepetido(int num, JTextField[] pastNums, int count) {
  30.       //Compara cada número que vaya sacando con los que ya hayan salido y devuelve true o false según esté repetido o no.
  31.         for (int i = 0; i < count; i++) {
  32.             if (Integer.parseInt(pastNums[i].getText()) == num) {
  33.                 return true;
  34.             }
  35.         }
  36.         return false;
  37.     }
  38. }

Y mi duda va sobre la condición del condicional if de esta clase que me devuelve valor true o false. Ya que sé que lo que hace es comparar los valores del array pastNums con el integer num, pero lo que no entiendo es qué valor compara cuando el array pasNums está vacío, es decir, cuando todavía no le he introducido ningún valor. Porque sé que por ejemplo los arrays de tipo int se rellenan por defecto con 0 y los de tipo String con null, pero no sé como se rellenan por defecto los arrays de tipo JTextField. Porque buscando por internet he leído que se rellena por defecto con "",pero entonces ¿como puede hacer un casting a integer de ""?.Sí alguien me pudiera explicar esta parte, le estaría muy agradecido
  #2 (permalink)  
Antiguo 16/03/2016, 03:46
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 3 meses
Puntos: 182
Respuesta: Duda con un array de tipo JTextField

Cita:
¿como puede hacer un casting a integer de ""?
No se puede. En esos casos siempre te lanza una: NumberFormatException: For input string: ""

En ese caso si funciona es porque esos campos de texto siempre contienen un numero.

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #3 (permalink)  
Antiguo 16/03/2016, 11:40
 
Fecha de Ingreso: marzo-2016
Mensajes: 3
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Duda con un array de tipo JTextField

Ya,eso es lo que pensé yo,pero leyendo el código (lo que he puesto en el post anterior es todo el código) no veo que se dé ningún valor a ese array antes de meterle los números aleatorios, y lo primero que pensé fué, igual este array se inicia con 0 también, pero no. Así que no sé como puede cumplirse la condición de ese if.
  #4 (permalink)  
Antiguo 17/03/2016, 01:41
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 3 meses
Puntos: 182
Respuesta: Duda con un array de tipo JTextField

Buenas,

Claro, pero es que ese codigo no funciona. Nunca se ejecuta el evento porque nunca se asigna (solo se hace un new que no sirve para nada).

Ademas de leerlo, has probado siquiera a ejecutarlo?


Si quieres aprender Java/Swing te recomiendo hacerlo por la via correcta y con codigo correcto: http://docs.oracle.com/javase/tutorial/uiswing/



Un saludo
__________________
If to err is human, then programmers are the most human of us
  #5 (permalink)  
Antiguo 17/03/2016, 04:23
 
Fecha de Ingreso: marzo-2016
Mensajes: 3
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Duda con un array de tipo JTextField

Sí probé a ejecutarlo y lo que me sorprendió es que cuando daba a la checkbox de automático se generaban los números aleatorios sin producirse ninguna excepción, por lo que el programa es totalmente funcional.Y eso es lo que me trae de cabeza, ya que como mi poca experiencia en java, veo que ese código no está del todo bien y aún así hace lo que se le pide.
Yo personalmente creo que para que ese código estuvies bien, antes del do while tendría que haber dado un valor al azar a gui.numeros[0] y luego el resto del código lo habría dejado como está. Algo como esto:
Código Java:
Ver original
  1. public void itemStateChanged(ItemEvent event) {
  2.         Object item = event.getItem();
  3.         if (item == gui.automatico) {
  4.             for (int i = 0; i < 6; i++) {
  5.                 int eleccion;
  6.                 //Estás dos lineas que hay a continuación son las que yo habría añadido antes de hacer el do while
  7.                 eleccion = (int) Math.floor(Math.random() * 50 + 1);
  8.                 gui.numeros[0].setText(""+eleccion);
  9.                 do {
  10.                     eleccion = (int) Math.floor(Math.random() * 50 + 1);
  11.                 } while (numeroRepetido(eleccion, gui.numeros, i));
  12.                 gui.numeros[i].setText("" + eleccion);
  13.             }
  14.         } else {
  15.             for (int i = 0; i < 6; i++) {
  16.                 gui.numeros[i].setText(null);
  17.             }
  18.         }
  19.     }
  20.      
  21.       boolean numeroRepetido(int num, JTextField[] pastNums, int count) {
  22.       //Compara cada número que vaya sacando con los que ya hayan salido y devuelve true o false según esté repetido o no.
  23.       for (int i = 0; i < count; i++) {
  24.           if (Integer.parseInt(pastNums[i].getText()) == num) {
  25.                 return true;
  26.             }
  27.         }
  28.         return false;
  29.     }
  30. }

Etiquetas: clase, jtextfield, programa, string, tipo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:58.