Java: differenza tra i metodi setPreferredSize () e setSize () nei componenti


Risposte:


116

L'utilizzo dipende dal fatto che il genitore del componente abbia o meno un gestore layout.

  • setSize() - utilizzare quando non esiste un layout manager principale;
  • setPreferredSize()(anche relativo setMinimumSizee setMaximumSize): utilizzare quando esiste un gestore layout principale.

Il setSize()metodo probabilmente non farà nulla se il genitore del componente sta usando un gestore di layout; i posti questo genere hanno un effetto sarebbe su componenti di livello superiore ( JFrameS e JWindowS) e le cose che si trovano all'interno delle lastre di scorrere. Devi anche chiamare setSize()se hai componenti all'interno di un genitore senza un gestore di layout.

Generalmente, setPreferredSize()disporrà i componenti come previsto se è presente un gestore layout; la maggior parte dei gestori di layout lavora ottenendo le dimensioni preferite (oltre che minime e massime) dei loro componenti, quindi utilizzando setSize()e setLocation()per posizionare quei componenti in base alle regole del layout.

Ad esempio, a BorderLayoutcerca di rendere i confini della sua regione "nord" uguali alla dimensione preferita della sua componente nord --- possono finire per essere più grandi o più piccoli di quella, a seconda della dimensione del JFrame, della dimensione degli altri componenti nel layout e così via.


1
Pensavo che un componente usasse 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 ()?
David Robles,

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

8
Il mio consiglio è di utilizzare sempre un gestore di layout. SetSize () dovrebbe essere pensato come qualcosa che chiama il gestore del layout, non qualcosa che chiami tu.
Kevin Day,

8
@Sbodd - JPanel ha un FlowLayout per impostazione predefinita. JFrame.getContentPane () ha un BorderLayout per impostazione predefinita.
Nemi

10

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

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

E assicurati che il contenitore del componente utilizzi un gestore layout che rispetti la dimensione richiesta. Il FlowLayout, GridBagLayoute SpringLayoutmanager utilizzano dimensione preferita del componente (gli ultimi due a seconda dei vincoli impostati), ma BorderLayoute GridLayoutdi solito don't.If si specificano nuovi suggerimenti per le dimensioni di un componente che è già visibile, è necessario invocare il metodo revalidate su per assicurarsi che la sua gerarchia di contenimento sia nuovamente strutturata. Quindi invoca il metodo repaint.


5

setSize ridimensionerà il componente alla dimensione specificata.

setPreferredSizeimposta la dimensione preferita. Il componente potrebbe non essere effettivamente di queste dimensioni a seconda delle dimensioni del contenitore in cui si trova o se l'utente ha ridimensionato manualmente il componente.


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

4

IIRC ...

setSize imposta la dimensione del componente.

setPreferredSizeimposta la dimensione preferita. Il Layoutmanager proverà a organizzare così tanto spazio per il tuo componente.

Dipende se stai usando o meno un gestore di layout ...


e cosa succede se aggiungo due jpanel a un jframe senza specificare esplicitamente un gestore di layout per il jframe? quale metodo devo usare per impostare la dimensione dei jpanel?
David Robles,

3
I riquadri dei contenuti utilizzano BorderLayout per impostazione predefinita ( java.sun.com/docs/books/tutorial/uiswing/layout/using.html ). Quindi il riquadro dei contenuti di JFrame ha un LayoutManager, quindi setPreferredSize dovrebbe funzionare ..
miku

Suona bene, ciò significa che dovrei usare setSize per JFrame e setPreferredSize per i componenti all'interno
David Robles,

1
In genere si usa frame.pack () per sfruttare la dimensione preferita calcolata di tutti i componenti figli. Altrimenti, se usi solo casualmente frame.setSize (), i componenti aggiunti al riquadro del contenuto si espandono / si contraggono per adattarsi allo spazio disponibile, il che significa che la dimensione preferita di ciascun componente può essere sovrascritta.
camickr
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.