Layout

Sono stati illustrati alcuni semplici esempi su come dimensionare o posizionare widget secondari in base alla dimensione dell'elemento principale di riferimento. Fino ad ora, questo tipo di calcolo si è verificato come risposta ad un listener di ridimensionamento. Questo è spesso il modo migliore per gestire il posizionamento di widget semplici. Tuttavia, esistono modelli comuni utilizzati dalle applicazioni durante il posizionamento di widget. Tali modelli possono essere strutturati come algoritmi di layout configurabili che è possibile riutilizzare con molte diverse applicazioni.

SWT definisce i layout che forniscono la dimensione e la posizione generale di widget secondari in un composto. I layout sono sottoclassi della classe astratta Layout. I layout SWT standard si trovano nel pacchetto org.eclipse.swt.layout.

Concetti relativi al layout dei widget

Durante il ridimensionamento e il posizionamento di widget è necessario comprendere alcune definizioni generali.

Questi concetti sono rilevanti per le applicazioni indipendentemente dall'utilizzo di un layout. In effetti, un layout può rappresentare un modo conveniente per impacchettare funzionalità ridimensionate per un successivo riutilizzo.

Alcuni concetti aggiuntivi vengono introdotti mediante i layout.

Per ulteriori concetti e relative rappresentazioni, consultare Comprensione dei layout in SWT .

Il seguente frammento di codice mostra il semplice caso di un'applicazione che utilizza un callback di ridimensionamento per portare la dimensione di un'etichetta alla dimensione della rispettiva shell principale.

Display display = new Display ();
Shell shell = new Shell (display);
Label label = new Label (shell, SWT.CENTER);
shell.addControlListener(new ControlAdapter() {
    public void controlResized(ControlEvent e) {
        label.setBounds (shell.getClientArea ());
    }
});

Il successivo frammento utilizza un layout per ottenere lo stesso effetto:

Display display = new Display ();
Shell shell = new Shell (display);
Label label = new Label (shell, SWT.CENTER);
shell.setLayout(new FillLayout());

Anche per questo semplice esempio, l'utilizzo di un layout riduce il codice dell'applicazione. Per layout più complessi, la semplificazione è maggiormente notevole.

SWT fornisce tre classi di layout predefiniti che possono essere utilizzati in diverse situazioni.

Fill Layout

FillLayout è la classe di layout più semplice. Dispone i widget in una singola riga o colonna, forzandoli sulle stesse dimensioni. Inizialmente, i widget avranno tutti le dimensioni del widget maggiore. FillLayout non effettua il wrap e non è possibile specificare i margini o la spaziatura.

È possibile utilizzare FillLayout per disporre pulsanti su una barra delle attività o degli strumenti, oppure per ordinare caselle di controllo in un Group.   FillLayout può anche essere utilizzato quando un Composite dispone di un solo elemento secondario. Nell'esempio precedente, FillLayout fa in modo che l'etichetta completi il riempimento della shell principale.

RowLayout

Anche RowLayout dispone i widget in righe, ma è maggiormente flessibile rispetto a FillLayout. È in grado di suddividere i widget, creando tutte le righe necessarie per visualizzarli. Fornisce anche margini configurabili su ogni bordo del layout e spaziatura configurabile tra i widget presenti nel layout. È possibile confezionare un RowLayout, che forzerà tutti i widget sulle stesse dimensioni. Se si giustifica un RowLayout, lo spazio extra che rimane nel Composite verrà allocato come margini tra i widget.

L'altezza e la larghezza di ciascun widget in un RowLayout può essere specificata in un oggetto RowData che deve essere impostato nel widget utilizzando setLayoutData.

Grid Layout

GridLayout è il layout più completo (e più complesso). GridLayout dispone i widget in una griglia e fornisce molti parametri configurabili che controllano la funzionalità delle colonne e delle righe della griglia quando il composto viene realizzato.

GridLayout definisce l'API che controlla la strategia generale del layout. L'attributo più importante è numColumns, che determina le dimensioni orizzontali della griglia. Generalmente l'utente decide questo valore durante il primo design dell'aspetto della finestra. L'ordine dei widget nella griglia è lo stesso in cui i widget sono stati creati. Per cambiare l'ordine dei widget nella griglia, è possibile utilizzare i metodi di Control, moveAbove(Control) e moveBelow(Control). Questi metodi consentono ai widget di essere inseriti prima o dopo un altro widget all'interno del layout. ("above" e "below" si riferiscono all'ordinamento Z dei widget, non alla posizione nella stessa griglia.)

La tabella seguente riepiloga i parametri configurabili per un GridLayout.

Attributo

Descrizione

horizontalSpacing

Numero di pixel tra il bordo destro di una cella e il bordo sinistro della cella vicina.

makeColumnsEqualWidth

Specifica se forzare tutte le colonne alla stessa larghezza.

marginWidth

Numero di pixel utilizzati per il margine sul bordo destro e sinistro della griglia.

marginHeight

Numero di pixel utilizzati per il margine sul bordo superiore e inferiore della griglia.

numColumns

Numero di colonne da utilizzare per comporre la griglia.

verticalSpacing

Numero di pixel tra il bordo inferiore di una cella e il bordo superiore della cella vicina.

GridLayout supporta molti altri parametri di layout per ogni widget della griglia. Queste proprietà sono specificate in un oggetto GridData. L'utente deve impostare un GridData come layoutData per ciascun widget della griglia.

La classe GridData definisce le costanti di stile che consentono all'utente di specificare combinazioni comunemente utilizzate di parametri di layout nel costruttore di GridData. È anche possibile impostare singolarmente questi attributi utilizzando i metodi pubblici in GridData.

È possibile ottenere layout complessi e altamente dinamici utilizzando GridData. Estendendo questi valori a diversi widget della griglia può produrre molte combinazioni differenti di layout. Anche i layout di dialogo più complessi possono essere specificati utilizzando GridData. La possibilità di consentire ai widget di estendersi oltre le celle produce molti layout che non assomigliano neanche a una griglia.

La seguente tabella riepiloga i parametri configurabili per GridData.   Per ulteriori descrizioni e immagini di esempio sull'utilizzo dei diversi parametri di griglia, fare riferimento a Comprensione dei layout in SWT.

Attributo

Descrizione

grabExcessHorizontalSpace

Specifica se una cella deve essere ingrandita per utilizzare tutto lo spazio orizzontale extra disponibile nella griglia. Dopo che le dimensioni delle celle nella griglia vengono calcolate in base ai widget e ai relativi dati della griglia, qualsiasi spazio extra presente nel Composto verrà assegnato a quelle celle hanno bisogno di spazio in eccesso.

grabExcessVerticalSpace

Specifica se una cella deve essere ingrandita per utilizzare tutto lo spazio verticale extra disponibile nella griglia.

heightHint

Specifica un'altezza minima per il widget (e quindi per la riga che lo contiene).

horizontalAlignment

Può corrispondere a BEGINNING, CENTER, END, FILL. FILL significa che il widget verrà dimensionato per riempire l'intera larghezza della cella di griglia.

horizontalIndent

Numero di pixel tra il widget e il bordo sinistro della relativa cella di griglia.

horizontalSpan

Specifica il numero di colonne della griglia su cui si deve estendere il widget. Per impostazione predefinita, un widget riempie una cella della griglia. Può ricoprire altre celle orizzontalmente mediante l'incremento di questo valore.

verticalAlignment

Può corrispondere a BEGINNING, CENTER, END, FILL. FILL significa che il widget verrà dimensionato per riempire l'intera altezza della cella di griglia.

verticalSpan

Specifica il numero di righe della griglia su cui si deve estendere il widget. Per impostazione predefinita, un widget riempie una cella della griglia. Può ricoprire altre celle verticalmente mediante l'incremento di questo valore.

widthHint

Specifica una larghezza minima per il widget (e quindi per la colonna che lo contiene).

Layout personalizzati

Occasionalmente, può essere necessario scrivere una propria classe Layout personalizzata. Ciò è utile quando si dispone di un layout complesso che viene utilizzato in molti punti diversi dell'applicazione. Inoltre, potrebbe essere utile quando è possibile ottimizzare il layout utilizzando una conoscenza specifica dell'applicazione. Prima di creare un layout personalizzato, considerare quanto segue:

A meno che non si stia scrivendo un layout molto generico che verrà utilizzato da vari widget di Composite, è spesso più semplice e più facile calcolare le dimensioni e la posizione di elementi secondari in un listener di ridimensionamento. Molti dei widget personalizzati SWT sono scritti in questo modo. Sebbene un nuovo widget possa essere implementato come coppia Composite/Layout, l'implementazione come Composite, che produce il layout in un listener di ridimensionamento e calcola la dimensione preferita in computeSize è più chiara e non comporta la scrittura di una classe supplementare.

Se comunque è necessaria una classe di layout personalizzato, è consigliabile per prima cosa implementare l'algoritmo del layout in un listener di ridimensionamento. Ciò rende più semplice il debug dello stesso algoritmo. Assicurarsi di verificare i vari casi per layout: ridimensionamento minore, maggiore, suddivisione e sequenza.  Una volta che si dispone dell'algoritmo funzionante, è possibile eseguire il refactoring del codice in una sottoclasse di Layout

I layout sono responsabili dell'implementazione di due metodi:

Ulteriori informazioni sui layout personalizzati sono reperibili in Comprensione dei layout in SWT.