
Originariamente inviata da
andbin
Non rendere le cose più complicate del necessario .... Mai sentito di dover calcolare il ramo più "lungo" di un albero per fare una GUI ...
Dovresti anche precisare (non l'hai fatto qui, né mi pare nelle altre discussioni aperte di recente) COME hai rappresentato la gerarchia dei componenti. XML? JSON? Un file di testo con tua struttura fatta-in-casa? Un DSL? Una base dati? Altro?
Nì, no, cioè non è detto. In Swing non c'è la necessità obbligatoria di creare i componenti "padre" prima dei componenti "figli", né il contrario. In altri framework GUI invece è diverso. Ad esempio in SWT (il framework GUI fatto dalla Eclipse Foundation e usato
anche da Eclipse), ogni componente
deve ricevere nel costruttore il componente "padre". In SWT, Button e Label hanno i costruttori:
public Button(Composite
parent, int style)
public Label(Composite
parent, int style)
Lì infatti è obbligatorio creare
prima il
parent. Ma in Swing no.
Che se chiarisci una volta per tutte come hai rappresentato la gerarchia, è meglio.

Questo è il file di configurazione:
codice:
[BEGIN-GENERAL]
//Proprietà comuni a tutti gli oggetti:
[SET-COMMON-PROPERTIES=1]:
Layout(#null#);
Visible(#true#);
[SET-COMMON-PROPERTIES=0].
[END-GENERAL]
[BEGIN-ALL-OBJECTS]
[JFRAMES=1]
[FRAME=1].[INDEX=#0#]
[SET-COMMON-PROPERTIES=1]:
Name(#MainFrame1#);
Bounds(#0, 0, 800, 600#);
Visible(#true#);
[SET-COMMON-PROPERTIES=0].
[SET-BASE-PROPERTIES=1]:
Parent(#null, null#);
CenterRelativeToParent(#true, true#).
[SET-BASE-PROPERTIES=0].
[FRAME=0].[INDEX=#0#]
[JFRAMES=0]
[CONTAINERS=1]
[CONTAINER=1].[INDEX=#0#]
[SET-COMMON-PROPERTIES=1]:
Name(#MainContainer#);
Bounds(#0, 0, 800, 600#).
[SET-COMMON-PROPERTIES=0].
[SET-BASE-PROPERTIES=1]:
Parent(#FRAME, MainFrame1#);
CenterRelativeToParent(#true, true#).
[SET-BASE-PROPERTIES=0].
[CONTAINER=0].[INDEX=#0#]
[CONTAINERS=0]
[JPANELS=1]
[PANEL=1].[INDEX=#0#]
[SET-COMMON-PROPERTIES=1]:
Name(#MainPanel#);
Bounds(#10, 10, 400, 400#).
[SET-COMMON-PROPERTIES=0].
[SET-BASE-PROPERTIES=1]:
Parent(#CONTAINER, MainContainer#);
CenterRelativeToParent(#true, true#).
[SET-BASE-PROPERTIES=0].
[PANEL=0].[INDEX=#0#]
[JPANELS=0]
[END-ALL-OBJECTS]
Per la creazione dinamica dei componenti uso:
codice:
Class classX = Class.forName(fullClassName);
Constructor constr = classX.getDeclaredConstructor();
constr.setAccessible(true);
Component c = (Component) constr.newInstance();
L'unica accortezza, allora, sarà di rendere visibile il componente PADRE solo dopo aver creato e aggiunto il FIGLIO? Oppure lo mostra comunque?