Autor Tema: Java simular un interfaz celular Jframe JTextField JButton separar números de 3  (Leído 1934 veces)

fiorestzin

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Hola comunidad. Estoy haciendo un mini proyecto en un ramo de mi universidad y se trata de una simulación de un Call Center. Para ello, simulé un interfaz celular en Jframe de java. Como pequeño desafío, quiero que cada 3 números que se ingrese, se me haga un espacio y siga con los siguientes 3 números.

Para ello me apoyé en youtube sobre un código para contar carácter y lo hice un método. Dicho método lo puse en el número 1 (botón) e hice su "if" correspondiente si cumple o no la condición de los 3 números. El resultado es que cuando apreto dicho número programado se queda pegado. Fijo es el ciclo for, pero no entiendo el porqué. Espero que me puedan ayudar!

Método que cree del ciclo for:
Código: [Seleccionar]

public int contar(String tex) {

        Scanner lector = new Scanner(System.in);
        int n = 0;
        tex=lector.nextLine();
        for (int i = 0; i < tex.length(); i++) {
            n++;
        }
        return n;
    }

Programación del botón número 1:
Código: [Seleccionar]
String tex=this.casilla.getText();
        if (contar(tex)==3) {
            this.casilla.setText(tex+""+"1");
        } else {
            this.casilla.setText(tex+"1");
        }

     
                         
« Última modificación: 15 de Octubre 2020, 18:29 por Ogramar »

fiorestzin

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Re:Problema con código java
« Respuesta #1 en: 08 de Junio 2020, 19:02 »
Parto disculpando, me equivoqué de sección de foro, leí mal! Pero por si acaso dejo el código de la solución a mi problema.

Metodo:

Código: [Seleccionar]
public int contar(String tex) {
        int n = 0;
        for (int i = 0; i < tex.length(); i++) {
            n++;
            if (n >= 4) {
                n = 0;
            }
        }
        return n;
    }

Boton:

Código: [Seleccionar]
String tex = this.casilla.getText();
        int a = contar(tex);
        System.out.println(a);
        if (a >= 3) {
            this.casilla.setText(tex + " " + "1");
        } else {
            this.casilla.setText(tex + "1");
        }
« Última modificación: 15 de Octubre 2020, 18:28 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re:Problema con código java
« Respuesta #2 en: 08 de Junio 2020, 20:22 »
Hola.
El método length() ya te proporciona cuántos caracteres tiene el String, no necesitas recorrer los caracteres con el bucle para contarlos.

Sin embargo, si pretendes que cada tres cifras/caracteres se inserte un espacio en blanco, la lógica que estás siguiendo me parece que no te servirá cuando tengas 6 números o más.

Me ha parecido interesante tu propuesta y he probado a ver que solución se me ocurría.
Y se me ha ocurrido una.

He hecho una pequeña interfaz más sencilla que la tuya, tan solo dos campos de texto, uno para mostrar los números, otro para introducirlos por teclado, y un botón para enviar lo tecleado al campo de texto que lo muestra.



Como puedes ver en la imagen, da igual la cantidad de números que se introduzcan. Cada tres cifras se insertar un espacio en blanco cuando se envía al campo superior.

Para conseguirlo lo que hago es recoger el texto que se ha introducido.
Y a partir de este texto, construyo un nuevo String (me apoyo en la clase StringBuilder que es más óptima para estas cosas).

Con un bucle recorro cada carácter del String original.
Y voy añadiendo carácter a carácter al nuevo String.
Cada tres caracteres que añado, entonces añado además un espacio en blanco.

Para saber cuándo llevo tres caracteres añadidos, podría haber usado un contador que al llegar a 3 se reinicie a 0 y empiece de nuevo.
Pero me ha parecido más rápido consultar si el indice del bucle que va recorriendo los caracteres, es un múltiplo de 3.
Los múltiplos de 3 son 3, 6, 9, 12, 15, etc...
De ese modo, cada posición 3, 6, 9...se insertará el espacio en blanco.

Te pongo aquí el código completo, coloreo el código de la clase ActionListener que añado al botón enviar, que es quién se encarga de construir el nuevo String como he explicado.
A ver si te resulta útil. Cualquier duda, solo tienes que preguntarla. Un saludo.

Citar
public class Separar extends JFrame{

   private JTextField display;
   private JTextField entrada;
   private JButton btEnviar;

   public Separar() {
      display = new JTextField(30);
      display.setEditable(false);
      display.setHorizontalAlignment(JTextField.CENTER);
      entrada = new JTextField(15);
      btEnviar = new JButton("Enviar");
      btEnviar.addActionListener(new AccionEnviar());

      JPanel panelDisplay = new JPanel();
      panelDisplay.add(display);
      JPanel panelEntrada = new JPanel();
      panelEntrada.add(entrada);
      JPanel panelEnviar = new JPanel();
      panelEnviar.add(btEnviar);
      
      JPanel principal = new JPanel();
      principal.setLayout(new GridLayout(3, 0, 10, 10));
      principal.add(panelDisplay);
      principal.add(panelEntrada);
      principal.add(panelEnviar);
      
      add(principal);
      setTitle("Separar de 3 en 3");
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      pack();
      setLocationRelativeTo(null);
      setVisible(true);
   }

   private class AccionEnviar implements ActionListener  {

      @Override
      public void actionPerformed(ActionEvent e) {

         String texto = entrada.getText();
         
         StringBuilder numeros = new StringBuilder();

         //Iremos añadiendo los caracteres recibidos y cada 3 pondremos un espacio
         for (int ix = 0; ix < texto.length(); ix++) {
            //Si el indice ix es multiplo de 3, es que ya llevamos 3 caracteres, ó 6, ó 9...
            if (ix % 3 == 0)
               numeros.append(" ");//Así que insertamos espacio en blanco
            
            //Añadimos carácter
            numeros.append(texto.charAt(ix));
            
            
         }
         //Tenemos un string con los caracteres separados de 3 en 3.
         //Los pasamos al display

         display.setText(numeros.toString());

      }
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         @Override
         public void run() {
            new Separar();
         }
      });
   }

}



NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

fiorestzin

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Re:Problema con código java
« Respuesta #3 en: 09 de Junio 2020, 14:39 »
Gracias Kabuto por tu aporte, más adelante probaré tú idea, suena interesante! Por el momento estoy atareados de trabajos y necesito finalizarlos y luego probaré tu solución alternativa! Es genial abordar el problema de perspectivas distintas, te abre tu mente!

Saludos!

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".