Ver Mensaje Individual
  #6 (permalink)  
Antiguo 31/08/2014, 12:35
Avatar de HackmanC
HackmanC
 
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Duda sobre consumo memoria y objetos

Hola,

Cita:
Iniciado por ladysun Ver Mensaje
... ¿1 clase por ventana? ¿1 clase por JPanel creado? ...
La cantidad de clases va a depender de lo que necesites hacer. Pero si aplicas las bases de la programación orientada a objetos, sabrás que cada clase define una entidad.

Por ejemplo, si un JPanel heredado no extiende la funcionalidad de otro JPanel lo suficiente para declararse independiente, no tiene sentido hacer una clase para cada JPanel.

Ahora bien, como en Swing cada JPanel normalmente contiene muchos elementos diferentes y se puede reutilizar. Habrá que ver si vale la pena o no, en cada caso por aparte, saber si se debe extender JPanel, y crear una clase por aparte o usar el JPanel base y solamente agregarle los componentes.

Cita:
Iniciado por ladysun Ver Mensaje
... Si es una clase por panel ¿cómo obtengo información de otros elementos de otro panel? ...
Los componentes 'Component' dentro de un contenedor 'Container' se almacenan en variables; de nuevo, aplicando OOP, se aplican las mismas reglas de cualquier variable, su accesibilidad puede ser pública, privada, protegida y de paquete. Y por encapsulación debes crear los respectivos 'getter' para tener acceso a una variable privada.

Por ejemplo:

Código Java:
Ver original
  1. private JLabel jLabel = new JLabel("Hola");
  2.  
  3. public JLabel getTheLabel() {
  4.   return jLabel;
  5. }

Ahora, si revisas la documentación del JFrame vas a encontrar varios métodos que comienzan con getCompo.. (heredados de la clase Container), que te sirven para tener acceso a todos los componentes. Te devuelve un Array de Component, pero identificar cual es cual es tan simple como:

Código Java:
Ver original
  1. for (Component c : MyFrame.getComponents()) {
  2.   if (c instanceof JLabel) {
  3.     System.out.println("El componente " + String.valueOf(c) + " es un Label);
  4.  }
  5. }

Que es casi lo mismo que el ArrayLista que estabas creando, con la diferencia que aquí, todos los componentes están juntos, no los JLabel separados de los JOtraCosa.

Cita:
Iniciado por ladysun Ver Mensaje
... ¿Protect, referencia al otro objeto, por constructor? ...
Esa no la entiendo, revisa la documentación de 'protect'.

Cita:
Iniciado por ladysun Ver Mensaje
... Por ejemplo tengo un botón de un panel A que actualiza un TextArea en otro panel B, pero tenga una clase Z que es la que maneja los eventos.
Para obtener el TextArea de la clase B (supuestamente un JPanel), solamente tienes que tener acceso al objeto B ya instanciado. Aplicando los getters que mencioné antes:

Código Java:
Ver original
  1. JPanelB.getMyTextArea()

Donde JPanelB es la referencia a la instancia que mantienes en algún lugar del programa para poder usarlo. Por lo visto, pareciera que la clase Z que maneja los eventos, debería de haber creado el objeto JPanelA y JPanelB, y por lo tanto debería de tener acceso a ellos en alguna variable.

Si fuera de otra forma que el A hubiera creado B y Z recibe el evento de A, entonces A debería de tener conocimiento de B (puesto que el lo creo) y posiblemente deberías crear un 'getter' para el JPanel (como el ejemplo del getter anterior, por ejemplo: JPanelA.getMyJPanelB() que devuelva el JPanel B).

Las posibilidades son muchas, así que es difícil saber con exactitud la estructura de tu programa.

Saludos,

ps:

En los personal no aconsejaría las variables 'public static' que facilitan tener acceso a los componentes de otro contenedor. Si quieres hacerlo de la forma 'fácil' busca información sobre la palabra reservada 'static'. Aunque con el tiempo te vas a dar cuenta, que los Componentes static en Swing son mas un problema que una solución.

Última edición por HackmanC; 31/08/2014 a las 12:50 Razón: ps