Autor Tema: agregar gran cantidad de jTextField  (Leído 5185 veces)

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

Desconectado llAudioslavell

  • Sv Member
  • ***
  • Mensajes: 126
agregar gran cantidad de jTextField
« : febrero 10, 2013, 02:55:27 pm »
Tengo un problema miren estoy creando un sudoku y pues como saben la matriz es de 9x9 y necesito 81 jTextField ... la verdad es que ya me canse  :yao_ming: voy recien 10 jtextfield y nose porque aveces se me cambian de tamaño..... habra alguna manera de crear una gran cantidad de controles por codigo? talves algun bucle??  Agradeceria mucho si me ayudaran  :)

Desconectado hkadejo

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 3346
Re:agregar gran cantidad de jTextField
« Respuesta #1 : febrero 10, 2013, 10:06:04 pm »
Tengo un problema miren estoy creando un sudoku y pues como saben la matriz es de 9x9 y necesito 81 jTextField ... la verdad es que ya me canse  :yao_ming: voy recien 10 jtextfield y nose porque aveces se me cambian de tamaño..... habra alguna manera de crear una gran cantidad de controles por codigo? talves algun bucle??  Agradeceria mucho si me ayudaran  :)

Crea una matriz o un arreglo, luego hace un tu for que llegue hasta 81...y en cada iteration vas creando un JtextField y lo vas mentiendo en cada posicion del arreglo. Ya despues solo haces referencia al arreglo y sus posiciones.

Desconectado llAudioslavell

  • Sv Member
  • ***
  • Mensajes: 126
Re:agregar gran cantidad de jTextField
« Respuesta #2 : febrero 11, 2013, 02:45:30 pm »
Crea una matriz o un arreglo, luego hace un tu for que llegue hasta 81...y en cada iteration vas creando un JtextField y lo vas mentiendo en cada posicion del arreglo. Ya despues solo haces referencia al arreglo y sus posiciones.

Gracias por la idea, la verdad se me esta complicando mucho esto pero lo resolveré... asi me voy a superar

Desconectado g00mba

  • The Communiter-
  • *
  • Mensajes: 14583
  • SOMOS LEGION
    • ALABADO SEA MONESVOL
Re:agregar gran cantidad de jTextField
« Respuesta #3 : febrero 11, 2013, 03:26:13 pm »
si haces una matriz bidimensional es mas sencillo ubicar celdas en particular que solo poner el vergo de numeros en fila en una matriz unidimensional.
« Última Modificación: febrero 11, 2013, 03:27:45 pm por g00mba »

Desconectado mxgxw

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 5666
  • Starlet - 999cc
    • mxgxw
Re:agregar gran cantidad de jTextField
« Respuesta #4 : febrero 11, 2013, 05:21:22 pm »
Aquí te dejo un código más Orientado a Objetos.

En este caso heredo de las clases JPanel y creo un CustomJPanel que guarda dentro de sí el arreglo bidimensional con los JTextBox utilizando un GridLayout, este nuevo JPanel utiliza como argumentos el número de filas y columnas.

Luego CustomJTextField hereda de JTextField y tiene una característica interesante y es que te permite guardar su posición dentro de si. Cuando se agregan los componentes al CustomJPanel se asigna la posición a cada uno de los JTextField por medio de su constructor.

Si revisas el código ambas clases están implementadas como clases internas ya que al menos en la aplicación solo me interesa agregar funcionalidad para esta aplicación específica. Pero si crees que podes reutilizar esto en otra aplicación simplemente sacalas a su propio Java file.

¿Por qué heredo de JTextField? pues porque al ser todos del mismo tipo puedo agregar "KeyListener" general a todos los componentes del CustomJPanel por medio de addDefaultKeyListener, así te evitas estar agregando KeyListeners a cada JTextField individualmente. Luego en el listener que implementes tu decides que hacer con cada posición. Dejo un pequeño código de ejemplo que cambia el título de la ventaja "padre" donde se utiliza el panel.

Dentro del CustomJPanel también tenes una funcion getTextFields() que te devuelve el arreglo bidimensional de JTextFields que te puede servir si queres recorrer todos los valores del arreglo desde la aplicación principal

Código: [Seleccionar]
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTextField;
import java.awt.GridLayout;
import java.awt.event.KeyEvent;

public class MainWindow extends JFrame {

private JPanel contentPane;

/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MainWindow frame = new MainWindow();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

class CustomJTextField extends JTextField {

private int row;
private int column;

public CustomJTextField(int row,int column) {
super();
this.row = row;
this.column = column;
}

public int getRow() {
return this.row;
}

public int getColumn() {
return this.column;
}
}

class CustomJPanel extends JPanel {


private JTextField textFields[][];

private int rows;
private int columns;

public JTextField[][] getTextFields() {
// Devuelve los JTextFields
return textFields;
}

public CustomJPanel(int rows, int columns) {
super();
this.rows = rows;
this.columns = columns;

this.setLayout(new GridLayout(rows, columns, 0, 0));

// Inicializar arreglo multidimensional
textFields = new JTextField[rows][];
for(int i=0;i<rows;i++) {
textFields[i] = new JTextField[columns];
}

// Inicializar JtextFields y agregarlos al panel
for(int i=0;i<rows;i++) {
for(int j=0;j<columns;j++) {
// Cada componente conoce su ubicación en el arreglo
textFields[i][j] = new CustomJTextField(i, j);
this.add(textFields[i][j]);
}
}
}

public void addDefaultKeyListener(java.awt.event.KeyListener listener) {
for(int i=0;i<this.rows;i++) {
for(int j=0;j<this.columns;j++) {
textFields[i][j].addKeyListener(listener);
}
}
}


}


/**
* Create the frame.
*/
public MainWindow() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
// Usando mi panel personalizado con numero de columnas y filas
contentPane = new CustomJPanel(9, 9);
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);

// Dentro del Keylistener no podre acceder al frame
// ni a sus funciones, en esta ocasion quiero cambiar el
// título de la ventana asi que utilizo "self" como
// una referencia a la ventana principal.
final JFrame self = this;
// Este keyListener manejara los eventos de teclado de TODOS los
// JTextField incluidos en el gridLayout
((CustomJPanel)contentPane).addDefaultKeyListener(new java.awt.event.KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
// El componente devuelto debe ser convertido a mi CustomJTextField
// para poder acceder a las funciones de obtener columna y fila
CustomJTextField currentField = (CustomJTextField)e.getComponent();
self.setTitle("Tecla abajo en ("+currentField.getColumn()+","+currentField.getRow()+")");

// TODO: Agregar codigo personalizado segun posición de X y Y
}

@Override
public void keyPressed(KeyEvent e) {
// El componente devuelto debe ser convertido a mi CustomJTextField
// para poder acceder a las funciones de obtener columna y fila
CustomJTextField currentField = (CustomJTextField)e.getComponent();
self.setTitle("Tecla presionada en ("+currentField.getColumn()+","+currentField.getRow()+")");


// TODO: Agregar codigo personalizado segun posición de X y Y

}

@Override
public void keyReleased(KeyEvent e) {
// El componente devuelto debe ser convertido a mi CustomJTextField
// para poder acceder a las funciones de obtener columna y fila
CustomJTextField currentField = (CustomJTextField)e.getComponent();
self.setTitle("Tecla arriba en ("+currentField.getColumn()+","+currentField.getRow()+")");


// TODO: Agregar codigo personalizado segun posición de X y Y
}

});
}

}

Y un screenshot:


  Uploaded with ImageShack.us
« Última Modificación: febrero 11, 2013, 05:49:48 pm por mxgxw »