2012-06-02 7 views
14

Ho letto alcuni post qui e ho iniziato perché alcune persone fannoL'uso di rilevante getPreferredSize() invece di utilizzare setPreferredSize() per i componenti di dimensione fissa

@Override 
public Dimension getPreferredSize() { 
    return new Dimension(500, 500); 
} 

invece di

setPreferredSize(new Dimension(500, 500)); 

Is not la seconda è migliore perché crea solo un oggetto Dimension mentre il primo ne crea eventualmente diversi (anche se non è tanto spreco di memoria)? O mi sbaglio? C'è una differenza?

+5

[alcune regole] (http://stackoverflow.com/questions/7229226/should-i-avoid-the-use-of-setpreferredmaximumminimumsize-methods-in-java-swi) – mKorbel

+0

Grazie per il collegamento. Anche se è un po 'strano che in un articolo menzionato nella risposta in alto si dice "non usare mai questo metodo [setPreferredSize] !!!" perché non ho mai avuto problemi con esso. Ma poi di nuovo non ho mai scritto UI davvero grandi/complesse. – IchBinKeinBaum

+0

questo riguarda la programmazione di alto livello :-), ma sgridare sii consigli su come evitare errori, nessuno parla lì che usare LayoutManager è facile, richiede a) imparare e provare, b) fare alcune domande – mKorbel

risposta

14

Una grande differenza è come il valore può cambiare nel tempo, e quindi quello che si sceglie dovrebbe dipendere da ciò che si vuole fare con il codice.

Se chiami semplicemente setPreferredSize(new Dimension(500, 500)); nel codice, farà come ti aspetti - imposta la dimensione preferita su 500x500. Tuttavia, altri codici nella tua applicazione possono potenzialmente sovrascrivere questo valore con uno nuovo - tutto può chiamare setPreferredSize() e l'ultima chiamata a questo metodo sarà il risultato finale.

Tuttavia, se si esegue l'override del metodo di getPreferredSize() nel codice, lo farà sempre ritorno 500x500. Non importa se qualcuno del tuo codice chiama il metodo setPreferredSize(), perché vengono effettivamente ignorati. Se si esegue l'override anche su getMinimumSize() e getMaximumSize(), è possibile forzare una dimensione fissa su un componente che non dovrebbe cambiare indipendentemente dalle dimensioni della finestra e degli altri componenti.

Tuttavia, come menzionato da @Andrew Thompson nei commenti, questo non è garantito in quanto alcuni gestori di layout possono scegliere di ignorarli, soprattutto se si sta scrivendo il proprio gestore di layout e aggiungendo un componente personalizzato ad alcuni genitori i contenitori ignoreranno anche questi metodi, a seconda di dove/come viene utilizzato il componente. Indipendentemente da ciò, è ancora più rigido di chiamare setPreferredSize() che può essere facilmente chiamato da un altro codice e completamente sovrascritto.

Ho anche l'override del metodo di getPreferredSize() (più getMinimumSize() e getMaximumSize()) per uno dei miei componenti personalizzati, come ad esempio un selettore di colori che ha bisogno di avere dimensioni specifiche per il componente da verniciare correttamente. Senza sovrascrivere questi metodi, i gestori di layout Swing non capiscono in che modo il componente personalizzato può essere posizionato e dimensionato in modo appropriato per le dimensioni di JFrame o JPanel.

+0

Grazie @AndrewThompson, sì è vero: ho cercato di cambiare la mia risposta per riflettere meglio. La mia intenzione era che fosse un modo più rigido di impostare le dimensioni di un componente, ma non necessariamente garantito. – wattostudios

+0

Buona modifica. Rumore cancellato +1 –

+0

Grazie per averlo chiarito. – IchBinKeinBaum

Problemi correlati