Creación de objetos en ejecución

Buenos días, como puedo crear objetos en tiempo de ejecución, me explico

Por ejemplo tengo una tabla con los siguientes campos:

Padre.                    Nombre.                  Width.                Pos_x.                Pos_y
JTextField.             JTextField1.            120.                    5.                       5
JTextField.             JTextField2.            120.                    5.                       20
JTextField.             JTextField3.            250.                    5.                       35

Yo al entrar la primera vez recorrer la tabla e ir añadiendo esos objetos en mi JFrame, Esto lo puedo hacer ahora mismo en FoxPro y resulta bastante cómodo, ya que un cliente necesita 3 campos más y solo tengo que entrar en esa tabla y añadirlos.

No se si me he explicado bien, el problema que yo veo es como ir dándoles el nombre "JTextField1", "JTextField2", etc...

Perdonen tantas molestias, pero cuando tenga todo esto terminado lo pondré aquí para que otros aprendan.

Un saludo

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Sr. Negativo

Es mejor aprender lo básico de Java

No es malo preguntar, pero andas muy perdido, es mejor conocer el lenguaje, leer y practicar mucho, además Google ayuda mucho.

Tiene que ver con arrays de objetos Aqui

public static final int MAX=10;
Object[]  objetos =new  Object[MAX];

for(Object o:objetos){
//aqui haces algo
}

Buenos días, sigo sin saber

Buenos días, sigo sin saber como puedo hacer lo de crear objetos dinámicamente o si no se puede, pondré un ejemplo completo de lo que hago:

1º Tengo una tabla que tiene los siguientes campos y rellena:

padre     nombre         xpanel      ypanel       ytext    wtest    htext    etiqueta
========================================================================================
frmIni    JTextField1     10          10           60       120      26       Nombre
frmIni    JTextField2     10          50           60       150      26       Apellidos
frmIni    JTextField3     10          90           60        25      26       Dirección

2º Yo cuando ejecuto mi aplicación hago lo siguiente:

LabelText txt1 = null, txt2 = null;

ResultSet result = null;
int nXPanel = 0;
int nYPanel = 0;
int nYText = 0;
int nWText = 0;
int nHText = 0;
String cEtiqueta = "";
int nVuelta = 0;
       
// Conecto con la base de datos
conn = JavaConnect.ConnecrDb();
Update_table();
       
// Hago un Select * from tabla where padre="frmIni", para que solo me muestre los controles de este JFrame
result = cargarControles_DDD();
       
if (result != null) {
    try {
        // Si hay registros
        while (rs.next()) {
            nVuelta += 1;
                   
            // Recojo los datos que hay grabados en la tabla
            nXPanel = result.getInt("xpanel");
            nYPanel = result.getInt("ypanel");
            nYText = result.getInt("ytext");
            nWText = result.getInt("wtext");
            nHText = result.getInt("htext");
            cEtiqueta = result.getString("etiqueta");
                   
            switch (nVuelta) {
                case 1:       // Si es el primer registro, creo el JTextField1
                    txt1 = new LabelText(nXPanel, nYPanel, 52, nYText, nWText, nHText, cEtiqueta);
                    break;
                case 2:       // Si es el segundo registro, creo el JTextField2
                    txt2 = new LabelText(nXPanel, nYPanel, 52, nYText, nWText, nHText, cEtiqueta);
                    break;
            }
        }
               
        // Añado los JTextField
        add(txt1);
        add(txt2);
    } catch (Exception e) {}
}

Ahora mi pregunta es, si tengo que añadir 50 JTextField, el SWITCH sería muy grande.

Se podría hacer que si tengo 20 registros en la tabla me cree 20 JTextField y si tengo 12 me cree 12. No se si me explico, pero esto mismo es lo que yo quiero conseguir, de esta forma yo puedo mover los controles por la pantalla en tiempo de ejecución y al salirme guardarlos con la nueva posición.

Espero su ayuda.

Un saludo

Imagen de ezamudio

JTable

Has probado ya la clase JTable? Esa es muy utilizada para mostrar varios registros y puede ser editable.

Imagen de neko069

Tutorial tablas

El tutorial oficial de manejo de tablas de Obstacle está bastante completo ;-)

Ahora, modificando tú código, lo que yo haría sería algo así:

if (result != null) {
    try {
        // Si hay registros
        while (rs.next()) {
             //creas cada que haya una fila
             LabelText txt = new LabelText( result.getInt("xpanel")
                                                                  , result.getInt("ypanel")
                                                                  , 52
                                                                  , result.getInt("ytext")
                                                                  , result.getInt("wtext")
                                                                  , result.getInt("htext")
                                                                  , result.getString("etiqueta")
             );
            //lo agregas
             add(txt);    
            }
        }
    }
     catch (Exception e) {
             //pinta de menos la salida del error, luego se quejan que no saben ni donde truena su codigo
             e.printStackTrace();
    }
}

Digo, es una solución medio puerca .... ok, ok bastante puerca, pero te va a sacar del apuro
mientras estudias el tutorial que te pasé.

Buenos días, creo que no me

Buenos días, creo que no me habeis entendido.

Yo tengo una tabla rellena con el nombre del JFrame, nombre del control, y posición del control dentro del JFrame.

Luego tengo un JFrame vacio, sin nada, y lo que quiero es que al iniciar el JFrame se recorra la tabla y me vaya creando dentro del JFrame los controles que yo tengo.

Por ejemplo el primer registro es:

frmIni    JTextField1     10          10           60       120      26       Nombre

Pues me tiene que crear un JTextField en la posición 10,10 y con un ancho de 120 y ponerle una etiqueta "Nombre". Todo esto lo tengo ya listo lo que no se es como hacer para ir agregando esos controles.

Si yo hago lo siguiente:

LabelText txt1 = null, txt2 = null, txt3 = null, txt4 = null, txt5 = null;
LabelText txt6 = null, txt7 = null, txt8 = null, txt9 = null, txt10 = null;

Luego mediante un SWITCH puedo ir mirando si es JTextField1, JTextField2, JTextField3, etc..., y lo hago para 10, pero si yo añado algún registro más en la tabla y quiero añadir ese nuevo objeto en el JFrame, tendría que modificar el código y meter un nuevo objeto JTextField11.

No se si me entendeis.

Un saludo

Imagen de paranoid_android

Otras ideas

Como menciono ezamudio sería más fácil con una tabla, pero aquí te doy otra idea si estas buscando crear Paneles dinámicos.

Esta forma es muy flexible pero al mismo tiempo muy trabajosa se podría intentar lo siguiente

Sé que existe una manera de crear objetos anónimos, tendrías que investigar cómo recuperarlos del contenedor.
Las clases de swing tienen una propiedad que se llama “name” (setName(), getName()), en lugar de accederlos por su referencia se puede preguntar por esta propiedad.
IMPORTANTE: Esto es solo a nivel de concepto este código no está comprobado podría ser algo así como

// Ejemplo de nombre como propiedad
JText nombre = new JText();
nombre.setName(“nombre1”);

// Crear un objeto anónimo, en google encuentras muchos ejemplos sobre todo de los listeners
// Como puedes ver no tiene referencia solo un new
new Objeto(){
// Métodos requeridos
 }

// Para agregarlos al contenedor, necesitas investigar si existe un constructor con el que puedas inicializar las propiedades posición X, Y, etc…
add ( new JText(), “nombre”); // Posiblemente esto funciona como un Hash

// En otra sección: Investigar cómo recuperarlos del contenedor...
JText nombre = (JText) Contenedor.get(); // Ojo aqui falta saber como extraerlos esta solo es la idea
if (nombre.getName().equals("nombre1")){
 // Aquí se programa lo que se necesita
}

Muchas gracias, he probado de

Muchas gracias, he probado de la siguiente manera:

while (rs.next()) {
    nVuelta += 1;
                   
    nXPanel = result.getInt("xpanel");
    nYPanel = result.getInt("ypanel");
    nYText = result.getInt("ytext");
    nWText = result.getInt("wtext");
    nHText = result.getInt("htext");
    cEtiqueta = result.getString("etiqueta");

    String cName = String.format("txt%d", nVuelta);
                   
    txt = new LabelText(nXPanel, nYPanel, nYText, nWText, nHText, cEtiqueta);
    txt.setName(cName);
    add(txt);
}

Y me agrega los controles perfectamente, todos los que tenga en la tabla, pero ahora me surge otro problema que no se como solucionar.

Los controles se agregan con la propiedad enabled(false), y tengo un botón que lo que quiero es poner los controles JTextField habilitados, o sea enabled(true), pero no se como hacer ahora para ir recorriendo esos controles que tengo en mi JFrame e ir cambiando la propiedad enabled

Un saludo

Buenos días, alguien puede

Buenos días, alguien puede decirme como saber, en modo ejecución, cuantos controles tengo en un JFrame y sus nombres para cambiarles una propiedad si es de un tipo u otro

Un saludo

Muchas gracias, pero ese

Muchas gracias, pero ese ejemplo es para saber los componentes de un JPanel y yo quiero saber los componentes que estén directamente en un JFrame

Imagen de neko069

@jpablo2003

Y te tomaste la molestia de cambiar el panel que viene en el ejemplo por tu frame? Si mal no recuerdo, debería de ser transparente.

Claro que me tome las

Claro que me tome las molestias.

Aparte yo mi JFrame lo creo desde NetBeans 7.2, y luego no se como se llama para ponerlo en lugar del JPanel. He probado con JFrame, jFrame, frame1, frame2, frmClientes (que es como lo tengo guardado), pero nada.

Gracias de todas formas.

Recién le estoy poniendo

Recién le estoy poniendo atención a este hilo.

Lo que tendrías que haber explicado antes es que estás queriendo persistir el layout de una ventana para después reconstituirla.

Usar una tabla de base de datos puede ser una mala opción porque cuesta más trabajo representar las jerarquías ( como ya pudiste date cuenta ), una mejor opción es usar JSON o ya de plano XML, existen muchos frameworks que te permiten guardar el layout en XML.

Para tu pregunta específica ya Mr- te había dicho que usaras arreglos ( o una lista ):

while(rs.next()) {
   lista.add(createTextFieldFrom(rs));
}

Así si tienes 50 registros, creas 50 elementos y los pones en esa lista. Si son solo 20 pues 20 y ya. No tienes que crear una interfaz con todos las variables si no sabes cuantas serán.

Revisandolo bien , ni siquieras necesitas la lista, porque el contendor a donde los vas a agregar ya tiene un lugar donde guardarlos. Cuando los quieras obtener se los pides al contenedor:

ventana.getComponents();

Para identificarlos les puedes poner un nombre con el método

setName();

Entonces quedaría algo así:

// al cargar los elementos
while( rs.next() ) {
   container.add( createComponent(rs));
}
....
// al persistirlos
PreparedStatement pstmt = .... // update layout set x = ?, y = ? width = ?, name = ? etc. etc
for( Component c : container.getComponents() ) {
   pstmt.setInt(1, c.getX());
   pstmt.setInt(2, c.getY());
    ...
    pstmt.setString(4, c.getName());
    pstmt.addBatch();
}

Y ya, no necesitas crear una variable en tu código por cada elemento.