2010-09-21 14 views
6

Abbiamo un wich JPanel contiene più JPanels wich contenere JComponents (diciamo JLabels e JTextboxes)Swing Components Allineare attraverso pannelli

All'interno di ciascuna delle JPanels interni che usiamo JGoodies layout al fine di garantire il corretto allineamento di tutte le etichette.

Ma ovviamente vorremmo avere tutte le etichette allineate indipendentemente su quale sottopannello sono.

Come potremmo farlo senza fissare la larghezza della colonna che contiene i JLabels?

Non possiamo perdere le JPanels poiché dobbiamo avere confini intorno a gruppi di componenti

risposta

2

Solo perché il JPanel s ha i bordi, non significa che in realtà hanno bisogno di contenere i loro contenuti apparenti. Imposta i pannelli su trasparente. Aggiungi i pannelli e i componenti al pannello di chiusura. Aggiungi componenti spaziatori per imitare gli inserti dei pannelli nel layout. Dovrai anche disattivare il "disegno ottimizzato", o alcuni di questi, per i componenti che si sovrappongono.

+2

Hm, potrebbe funzionare, ma ho il sospetto che causerà molti mal di testa in tutti i tipi di casi d'angolo quando i bordi non corrispondono ai componenti che dovrebbero circondare. –

+0

@ Michael Cosa intendi? Per me va bene! –

4

Non c'è un modo semplice per fare ciò che io sappia. Le opzioni:

  • Scrivi la tua gestore di layout (o estendere uno esistente) con quella capacità di
  • colonna fissa larghezze
  • decidere che i pannelli che sono visivamente separati da confini non devono avere il loro contenuto allineato dopo tutto
+0

+1. Sono d'accordo con Michael, devi sederti e progettare il layout data la sua complessità. – bragboy

+0

L'ho provato anch'io ed è incredibilmente difficile. Il problema principale, per quanto mi ricordo, è l'ordine in cui vengono chiamati i 2 (o più) metodi di layout dei pannelli, o anche il fatto che uno possa essere chiamato ma non l'altro ... – jfpoilpret

+0

Preferisco consigliamo di utilizzare solo un pannello e utilizzare alcune "classi di builder" per aggiungere componenti ad esso, in modo da poter riutilizzare i builder per diversi tipi di "gruppi di componenti". – jfpoilpret

1

Ho letto suggerimenti sull'utilizzo di JSeparator anziché su JPanels multipli con bordi, se l'allineamento dei widget è la priorità.

JSeparator fornisce l'effetto visivo di raggruppare i widget, ma essi stessi sono solo un altro semplice widget che si inserisce nello stesso JPanel. Leggi il tutorial per suggerimenti importanti come l'impostazione della dimensione preferita. http://download.oracle.com/javase/tutorial/uiswing/components/separator.html

Inoltre, le attuali linee guida di Apple suggeriscono semplicemente di utilizzare lo spazio vuoto come divisore tra i raggruppamenti, in alternativa ai bordi e ai separatori.

6

Raccomando di privilegiare layout piatti su quelli nidificati. In un unico layout l'allineamento è facile. Evita TitledBorders e sostituiscile con separatori, separatori o solo spazi bianchi. Questo aiuta per la grande maggioranza di editori e moduli.

Ma se si desidera allineare più editor o moduli, la tecnica di cui sopra non riesce. Il FormLayout di JGoodies fornisce due livelli per risolvere questi problemi e, più in generale, per migliorare la coerenza del layout: 1) limiti inferiori per le dimensioni, 2) variabili di layout.

Con 1) è possibile descrivere i layout che garantiscono una larghezza minima tra le forme. Ad esempio, se vuoi dire che tutte le colonne di etichette hanno almeno una larghezza di 100 px, puoi dire "[100px, pref]" per la colonna dell'etichetta.

2) va oltre l'approccio 1). E la motivazione è estrarre il 100px dalle tue molte forme. In FormLayout puoi impostare le variabili di layout, ad esempio $ label che configuri come "[100px, pref]" o "right: [75dlu, pref]", ecc. Se utilizzi la variabile di layout in tutti i tuoi editor, queste saranno coerente e si dispone di un'unica posizione in cui è possibile configurare tutte le colonne di etichette per tutti gli editor.

+0

Ciao Karsten, sono d'accordo sul layout piatto, ma era un requisito (a quei tempi) avere gruppi: -/ Non conoscevo le variabili di layout. Buono a sapersi. –

0

Questo codice di esempio può aiutare a risolvere il tuo problema di allineamento:

//c is instance of the content pane 
c.setLayout(gl=new GridLayout(3,0)); 
//jp is a jpanel. I took this panel because there is no alignment 
//setting for a specifiq cell of grid Layout. 
jp.setAlignmentX(CENTER_ALIGNMENT); 
//jl is the jLabel 
jp.add(jl); 
//finally I add that with the frame 
c.add(jp); 

spero che vi aiuterà a risolvere il problema.

+0

ehh .. come sarebbe di aiuto nell'allineare i pannelli _across_? – kleopatra