2009-11-23 19 views

risposta

105

La risposta breve è: è complicato.

La risposta leggermente più lunga è: utilizzare setSize() se il genitore del componente non ha gestore di layout, e setPreferredSize() e il relativo setMinimumSize e setMaximumSize se lo fa.

setSize() probabilmente non farà nulla se il genitore del componente sta usando un gestore di layout; i posti che questo avrà in genere effetto saranno i componenti di livello superiore (JFrames e JWindows) e le cose all'interno di scrolled panes. Devi anche chiamare setSize() se hai componenti all'interno di un genitore senza un gestore di layout.

Come regola generale, setPreferredSize() dovrebbe fare la "cosa giusta" se si dispone di un gestore di layout; la maggior parte dei responsabili di layout lavorano ottenendo le dimensioni preferite (nonché la minima e massima) dei loro componenti e quindi utilizzando setSize() e setLocation() per posizionare tali componenti in base alle regole del layout. Quindi (ad esempio) un BorderLayout proverà a rendere i limiti della sua regione "nord" uguale a preferred size del suo componente nord: potrebbero risultare più grandi o più piccoli di così, a seconda delle dimensioni dello jframe, la dimensione di gli altri componenti nel layout e così via.

+1

Pensavo che un componente stesse usando un gestore di layout per impostazione predefinita (BorderLayout?), Quindi se non imposto esplicitamente un gestore di layout significa che dovrei usare setSize() invece di setPreferredSize()? –

+3

Credo che JPanels utilizzi BorderLayout per impostazione predefinita, ma JComponent non ha un layout predefinito. La maggior parte delle volte, è meglio impostare un gestore di layout se si aggiungerà qualcosa invece di usare setSize(). – Sbodd

+8

La mia raccomandazione è di usare sempre un gestore di layout. SetSize() dovrebbe essere pensato come qualcosa che il manager del layout chiama, non qualcosa che chiami. –

5

setSize saranno ridimensionare il componente alla dimensione specificata.

setPreferredSize imposta la dimensione preferita. Il componente potrebbe non essere effettivamente questa dimensione a seconda della dimensione del contenitore in cui si trova o se l'utente ha ridimensionato il componente manualmente.

+0

Puoi mostrare un esempio completo di setPreferredSize (...). Penso che questo sarebbe utile. –

4

IIRC ...

setSize imposta le dimensioni del componente.

setPreferredSize imposta la dimensione preferita. Il Layoutmanager proverà a sistemare tanto spazio per il componente.

Dipende se si sta utilizzando un gestore di layout o no ...

+0

e cosa succede se aggiungo due jpanel a una jframe senza specificare esplicitamente un gestore di layout per la jframe? quale metodo dovrei usare per impostare la dimensione dei jpanel? –

+3

I riquadri dei contenuti utilizzano BorderLayout per impostazione predefinita (http://java.sun.com/docs/books/tutorial/uiswing/layout/using.html). Quindi il contentpane di JFrame ha un LayoutManager, quindi setPreferredSize _should_ work .. – miku

+0

Sembra buono, questo significa che dovrei usare setSize per JFrame e setPreferredSize per i componenti all'interno di –

9

setSize() o setBounds() può essere utilizzato quando non viene utilizzato il gestore di layout.

Tuttavia, se si utilizza un gestore di layout è possibile fornire suggerimenti al gestore di layout utilizzando i setXXXSize() metodi come setPreferredSize() e setMinimumSize() ecc

ed essere sicuri che il contenitore del componente utilizza un gestore di layout che rispetta la richiesta dimensione.I gestori FlowLayout, GridBagLayout e SpringLayout utilizzano la dimensione preferita del componente (gli ultimi due in base ai vincoli impostati), ma in genere non lo sono BorderLayout e GridLayout.Se si specificano i nuovi suggerimenti per le dimensioni per un componente già visibile, è necessario invocare il metodo di convalida su di esso per assicurarsi che la sua gerarchia di contenimento sia di nuovo disposta. Quindi richiamare il metodo di ripetizione.

Problemi correlati