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.
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();
}
});
}
}