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:
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
- Inicie sesión o regístrese para enviar comentarios
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
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:
========================================================================================
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:
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
JTable
Has probado ya la clase JTable? Esa es muy utilizada para mostrar varios registros y puede ser editable.
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í:
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:
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 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
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
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:
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
Por si te sirve
Hola. Por si te sirve http://java.ittoolbox.com/documents/how-to-find-components-inside-a-jpanel-container-18187
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
@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 ):
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:
Para identificarlos les puedes poner un nombre con el método
Entonces quedaría algo así:
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.