Newsgroup: it.comp.java
Titolo: pack()

sto prendendo confidenza con awt e mi sto facendo le mie belle 
grafichine. tutto va bene tranne (almeno per ora) in un caso.  quando 
devo comprimere tutto il pack() non mi funziona. purtroppo la 
documentazione ufficiale ï¿œ essenziale  e non mi dice molto. ma il pack 
va bene per tutti i layout?
posto in coda un frammento di codice che disegna una finestra a mo' di 
chat. il problema che mi da ï¿œ che il pannello contenete la label, il 
textfield e il bottone occupa lo stesso spazio dell'area di testo
	   Frame f = new Frame("Area di testo");
	   f.setSize(500, 300);
	   f.setLocation(0, 0);
	   Panel inserimento = new Panel();
	   inserimento.setLayout(new FlowLayout());
	   etichetta = new Label("Testo");
	   testo = new TextField(40);
	   bottone = new Button("Inserisci");
	   inserimento.add(etichetta);
	   inserimento.add(testo);
	   inserimento.add(bottone);
	   Panel out = new Panel();
	   out.setLayout(new GridLayout(2, 1));
	   TextArea areaditesto = new TextArea();
	   out.add(areaditesto);
            out.add(inserimento);
	   f.add(out);
            f.addWindowListener(new ascoltaFinestra());
            f.pack();
            f.setVisible(true);
spero di essere stato abbastanza chiaro nell'esporre il problema

il 19.02.2010 19.29, Scrive Francesco 38506728:

Sono almeno sei o sette anni, o forse piu', che non uso piï¿œ AWT, almeno 
dalla versione 1.03 delle Swing, ora incluse nel JDK standard.
Se aggiungi import javax.swing.*, sostituisci JPanel a Panel, JFrame a 
Frame, JButton a Button, JLabel a Label, JTextField  a TextField e 
JTextArea a TextArea, probabilmente si mette tutto magicamente a posto.
Per quanto possa ricordare con i componenti AWT occorreva impostare 
tutte le  size per evitare defaults indesiderati.
Ti segnalo anche WindowAdapter, da usare al posto del tuo 
ascoltaFinestra(), per mette di implementare i soli metodi 
"interessanti" dell'interfaccia WindowListener, ad esempio:
f.addWindowListener(new WindowAdapter() {
   public void windowClosed(WindowEvent e) {
     f.dispose();
   }
});
dichiarando final JFrame f.. oppure incapsulandola in un metodo 
d'istanza, tipo:
JFrame getFrame() {
   if (f == null) f = new JFrame();
   return f;
}
...
f.addWindowListener(new WindowAdapter() {
   public void windowClosed(WindowEvent e) {
     getFrame().dispose();
   }
});

grazie per la risposta e soptrattutto grazie per i suggerimenti. credo 
che adesso posso semplificare i miei piccoli programmi prima di passare 
a qualcosa di piï¿œ complesso. grazie
ps: usando il BorderLayout non ho questo inconveniente

finalmente ho scoperto l'errore, o meglio gli errori:
* non ha senso compattare tutto con pack() se prima ho usato setSize()
* il tipi di layout grid utilizzano dimensioni fissate per tutte le 
celle  in base al contenuto della cella piï¿œ grande

 celle  in base al contenuto della cella piï¿œ grande
questo vale per il pannello esterno, composto di due righe ed una sola 
colonna, ma sui componenti del pannello interno, che utilizza il 
flowlayout, il gridlayout non interviene.

appena penso di aver capito qualcosa vengono fuori mille altri 
quesiti... alla faccia della punta dell'iceberg!
ho letto un articolo dove parlava di due modi diversi di progettare 
un'interfaccia:
* la prima specificando setsize e quindi partire dal bordo esterno per 
poi collocare gli oggetti;
* il secondo metodo (quello che mi interessa maggiormente) ï¿œ disegnando 
i pannelli piï¿œ interni e allargarci mano mano verso l'esterno l'asciando 
a java il compito di dimensionare l'applicazione alle dimensioni piï¿œ 
ridotte (quindi pack)
come ha scritto in un'altro post
 > Per quanto possa ricordare con i componenti AWT occorreva impostare 
tutte le  size per evitare defaults indesiderati.
se rispetto questa regola arrivo alla fine che setsize ï¿œ superflua
capisco che puï¿œ sembrare una discussione inutile, ma dovendo sostenere 
un esame sono piï¿œ interessato all'aspetto teorico che a quello pratico 
(gui con netbeans :) )