Author Topic: Acceso a componentes  (Read 11569 times)

StarKaz

  • Newbie
  • *
  • Posts: 20
  • Karma: 0
    • View Profile
Acceso a componentes
« on: Julio 18, 2024, 07:45:52 pm »
Hola
Ya le he dado un millón de vueltas con todos los getters que he podicdo y no doy encontrado la solución.
Tengo un javax.swing.JFrame, al que le añado una menubar, un toolbar y un desktopane., al desktopane le añado según me aprece un Jinternalframe u otro. El caso es que necesito acceder al Jframe desde el internalframe sin pasarle la variable del jframe y asi desde ahí poder acceder al desktop o a la toolbar según me interese, pero sin tener que pasarle las variables, porque puedede haber o no la toolbar por ejemplo… y no he dado con la forma…. Podrías ayudarme con eso pro favor?? No e si me he explicado bien

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5541
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Acceso a componentes
« Reply #1 on: Julio 19, 2024, 08:41:12 am »
Hola

Cualquier componente tiene el método getParent() que le devuelve dentro de qué "contenedor" está incluido. Llamando a jinternalFrame.getParent() puedes obtener el contenedor en el que está incluido y verificar si es el JFrame o el que necesites. Si no lo es, tienes que seguir "navegando" hacia arriba por el getParent()

Tendrás que apañar el código, pero la idea puede ser algo como esto.
Code: [Select]
Container parent = jinternalframe.getParent()
while (! (parent instanceof JFrame)) {
   parent = parent.getParent();
}

Si quieres el JFrame, el método SwingUtilities.getWindowAncestor(component) te hace este bucle hasta llegar al "window" que contiene el componente. Este puede ser un JFrame, un JDialog, .. Quizás también SwingUtilities.getRoot().

De la misma forma, para ver qué componentes tiene un contenedor, puedes usar getComponents(). Así que del JFrame, si no tienes métodos adecuados para localizar el toolbar, desktop o componente que necesites, puedes ir bajando hasta que localices el que quieras.

Desde luego, no es la forma más eficiente. Quizás puedas guardar los componentes que te interesen en un Map con una key adecuada, ejemplo map.put("toolbar", myToolbar). Para buscarlos, solo consultar en Map y un if por si te devuelve null (caso que comentas de que no haya toolbar).

Saludos.

StarKaz

  • Newbie
  • *
  • Posts: 20
  • Karma: 0
    • View Profile
Re: Acceso a componentes
« Reply #2 on: Julio 21, 2024, 11:05:15 pm »
Gracias por la respuesta, ahi lo del getparent y swingutlities ya lo habia probado pero no me daba ningun resultado.... el problema que encuentro es que lo queria hacer en el constructor, pero hasta que no ocurre ciertos eventos no es posible obtener el jframe ( una vez tengo el jframe ahi si, saco todos los demas componentes sin problema, en el primer sitio que me di cuenta fue en el internalFrameOpened, y despues vi que en eventos formHierarchyChanged y formPropertyChange tambien lo saco, pero de momento tal y como lo estoy haciendo no consigo provocar el evento necesario desde el constructor... basicamente hasta que no le hago un add al desktoppane y un setvisible no hay manera, y para entonces ya necesitaba tener todo lo demas...

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5541
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Acceso a componentes
« Reply #3 on: Julio 22, 2024, 08:10:17 am »
Buenas

Imagino que te refieres al constructor del componente. Si el componente no está construido no puedes meterlo en ningún lado y por tanto no puedes mirar ahí su jerarquía. Salvo que en el constructor mismo lo añadas donde sea, pero eso ya te obligaría a pasar el padre (el JFrame o lo que sea) como parámetro del constructor.

Saludos.

StarKaz

  • Newbie
  • *
  • Posts: 20
  • Karma: 0
    • View Profile
Re: Acceso a componentes
« Reply #4 on: Julio 23, 2024, 02:08:05 am »
Si, estaba dándole vueltas a un código de hace unos años que encontré para hacer Jinternalframes modales y que en su momento retoque como pude para que funcionara, pero tal y como lo tenía no podía crear una librería independiente del Jframe, cuando me dijiste que no había otra que pasar el JFrame en el constructor del jinternalframe (en este caso) pues cree una clase que extiende a JFrame y después extiendo el JFrame a este último con una serie de listeners, propiedades y métodos que después puedo sobrescribir y al fin conseguí asilar todo ese código y crear una librería aparte sin fallos de dependencias de componentes y sus nombres. Tengo que darle unos retoquitos mas (¡¡¡y comentarlo!!! Que eso siempre lo voy dejando y luego no me entero)

Gracias por la orientación, la ultima vez me diste la solución directamente, pero esta vez conseguí aprender más cosas XD

Y ya que estamos…. Sabrias decirme como hacer una librería de librerías?? Quiero decir crear un jar con los siguientes por ejemplo:
balloontip-1.2.4.1.jar
javax.mail.jar
postgresql-42.6.0.jar

uso netbeans 16

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5541
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Acceso a componentes
« Reply #5 on: Julio 23, 2024, 08:09:30 am »
Buenas

Para dependencias, lo mejor es usar maven, gradle o una herramienta similar. En un fichero propio de la  herramienta (pom.xml en maven o build.gradle en gradle) pones las dependencias que necesita y se descargan automáticamente de internet cuando compilas. Esas herramientas te permiten también hacer de forma fácil un zip que tenga dentro tu programa y las dependencias de forma que puedas desempaquetarlo en el ordenador que quieras. No conozco netbeans, pero seguramente soporte este tipo de herramientas. IntelliJ Idea y Eclipse lo hacen.

Otra alternativa que se usa a veces, aunque a mi no me gusta mucho, es hacer un único jar con todo dentro. Un jar no deja de ser como un zip con todas las clases compiladas dentro. Nada te impide desenpaquetarlos todos en un mismo directorio y luego empaquetar todo junto en un solo jar. Puedes hacerlo con el comando "jar" que viene con java o hay herramientas que te permiten hacerlo como https://one-jar.sourceforge.net/ .

Saludos.


StarKaz

  • Newbie
  • *
  • Posts: 20
  • Karma: 0
    • View Profile
Re: Acceso a componentes
« Reply #6 on: Julio 24, 2024, 11:42:12 am »
ok, muchas gracias
se bueno??

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5541
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Acceso a componentes
« Reply #7 on: Julio 24, 2024, 04:55:05 pm »
Se bueno :)