Newsgroup: it.comp.java
Titolo: [swing] dimensioni dei contenitori

Ho notato uno strano comportamento di cui mi e' balzato in mente di parlarvi
:
perche' se nel seguente esempio uso frameBuono le dimensioni dei componenti
vengono calcolate correttamente, mentre se uso frameCativo no?
ho anche visto che per risolvere il problema posso inserire nel
paint(Graphics g) di canvas l'istruzione
this.setSize((int)this.getParent().getWidth()-<dimensione del
panel>,(int)this.getParent().getHeight());
qualcosa risolvo, ma non mi sembra comunque comodo...e poi perche un
comportamento diverso se gli oggetti li piazzo prima in un JPanel piuttosto
che direttamente nel JFrame?
grazie 1000!
class canvas extend Canvas()
{
    ...
    //calcolo le dimensioni di oggetti usando this.getHeight() e
this.getWidth()
}
class panel extend JPanel()
{
    ...
    //calcolo le dimensioni di oggetti usando this.getHeight() e
this.getWidth()
}
class frameBuono extend JFrame()
{
        ...
        panel p = new panel();
        canvas c = new canvas();
        getContentPane().add(p);
        getContentPane().add(c);
        setSize(new Dimension(800,450));
        ....
}
class frameCattivo extend JFrame()
{
        ...
        panel p = new panel();
        canvas c = new canvas();
        JPanel pannello = new JPanel();
        pannello.add(p);
        pannello.add(c);
        getContentPane().add(pannello);
        setSize(new Dimension(800,450));
        ....
}
-- 
"...Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno
sprovveduto che non lo sa e la inventa...".
             Albert Einstein

La risposta è semplicissima.
Nel FrameBuono, attacchi i tuoi componenti direttamente al ContentPane del
JFrame.
Il ContentPane di default del JFrame, è un normale Container con LayOut =
null.
Questo significa che gli oggetti che gli verranno passati, avranno
dimensione e posizione, in base a quelle impostate da programmatore ( o
ovviamente quelle di defalut dell'oggetto stesso).
Nel FrameCattivo, inserisci i tuoi componenti non più direttamente dentro il
ContentPane, ma li passi ad un JPanel che fa da contenitore, il quale poi lo
passi a ContentPane.
Il JPanel però a differenza del ContentPane, ha un LayOut di default (se non
ricordo male ha un FlowLayout).
Questo significa che qualunque componente gli attacchi sopra, tenderà ad
essere riposizionati e ridimensionato in base all'algoritmo del LayOut
usato, con eventuali correzioni di dimensionamento dovuti ad eventuali
settaggi di Preferred, Minimum e Maximum size.
Se vuoi avere l'effetto contrario a quello da te citato, prova ad aggiungere
:
    - al FrameBuono  : getContentPane().setLayout(new BorderLayout())
    - al FrameCattivo : panel.setLayout(null);
avrai la sityuazione esattamente contraria a quella da te riscontrata.
Ti consiglio di studiare i Layout e di guardare meglio com'è costituito un
JFrame.
Ciao.

 wrote in message
news:agje7u$3nec$1...@stargate1.inet.it...
| La risposta è semplicissima.
|
--cut
| Se vuoi avere l'effetto contrario a quello da te citato, prova ad
aggiungere
| :
|     - al FrameBuono  : getContentPane().setLayout(new BorderLayout())
|     - al FrameCattivo : panel.setLayout(null);
|
| avrai la sityuazione esattamente contraria a quella da te riscontrata.
|
| Ti consiglio di studiare i Layout e di guardare meglio com'è costituito un
| JFrame.
| Ciao.
Grazie, sei stato molto preciso, ed in effetti cambiando i Layout
funge(senza settare niente per il JFrame), solo che non credo che un JFrame
abbia null come Layout di default...se fosse cosi', inserendovi dei
componenti dovrei settare le posizioni e le dimensioni...cosa che invece non
fo e intando continua a fungere :-)