2010-04-30 10 views
10

Utilizzo un FlowLayoutJPanel. Il pannello appare brutto quando le altezze dei componenti figlio sono diverse. Sto cercando una soluzione per renderli top-align (simile a valign="top" con celle di tabella in HTML).Allineamento superiore per FlowLayout

+1

Avete dato un'occhiata a MigLayout? –

risposta

14

Mi rendo conto che questa domanda è stato chiesto più di un anno fa, ma come me, ho pensato che molti sarebbero incappare in questo post sul forum ed essere lasciato tentare di fare una soluzione come quella suggerita nel bug report (non ha funzionato per me solo fyi).

In entrambi i casi c'è una risposta migliore da JDK 1.6. FlowLayout ha il seguente metodo:

public void setAlignOnBaseline(boolean alignOnBaseline) 

Se si utilizza questo metodo sul tuo FlowLayout e impostarlo su true, poi quando FlowLayout delinea i componenti Controllerà linea di base di ogni componente e allineare la componente lungo questa linea di base.

Ma non è tutto quello che devi fare.

Il componente in questione deve ignorare i seguenti due metodi in questo modo:

@Override 
public Component.BaselineResizeBehavior getBaselineResizeBehavior() { 
    return Component.BaselineResizeBehavior.CONSTANT_ASCENT; 
} 

@Override 
public int getBaseline(int width, int height) { 
    return 0; 
} 

Sono metodi JComponent e layout e layoutmanagers utilizzare questi metodi per determinare come il layout del componente.

Se si eseguono i passaggi sopra indicati, tutti i componenti si allineano lungo la parte superiore di ogni riga. Ovviamente, se vuoi semplicemente utilizzare un componente come JButton, dovrai ovviamente estenderlo per raggiungere l'obiettivo desiderato ... ma non è tanto il lavoro che il layout con overriding con una soluzione che devi eseguire il debug. Almeno credo.

Buona fortuna, -Asaf

+1

+1. La soluzione non ha funzionato neanche per me, ma penso che sia perché esiste per uno scopo diverso. Come indicato nel rapporto bug: * "Le tre opzioni di allineamento verticale sarebbero in alto, al centro e in basso. ** Disporre le cose esattamente allo stesso modo, ** ma rilasciare i componenti nella parte centrale o inferiore di il pannello".* – Rempelos

1

Qualcun altro ha desiderato questo, sotto forma di un bug report (che elenca anche una soluzione alternativa).

Dai un'occhiata alla

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4295966

+0

Oh. Penso che seguirò la soluzione. Grazie! – mrpaint

+0

In realtà questa segnalazione di bug ha uno scopo diverso: * "Aggiungi un'opzione al layout del flusso per farmi specificare l'allineamento verticale Le tre opzioni di allineamento verticale sono in alto, al centro e in basso. allo stesso modo, ** ma rilascia i componenti nella parte centrale o inferiore del pannello. "* Quindi la soluzione alternativa del collegamento consente di scegliere tra tre opzioni per il posizionamento verticale dei componenti (FlowLayout li mette sempre in alto) ma rimarranno comunque allineati al centro nel caso in cui abbiano altezze diverse. Solo sottolineando ... – Rempelos

1

Si dovrebbe essere in grado di utilizzare un BoxLayout. Supporta l'allineamento verticale. L'unico problema è che devi inserire manualmente i componenti del montante orizzontale.

Oppure si potrebbe provare a utilizzare il Relative Layout. Nel tuo caso si usa:

RelativeLayout rl = new RelativeLayout(RelativeLayout.X_AXIS, 5); 
rl.setBorderGap(5); 
rl.setAlignment(RelativeLayout.LEADING); 
JPanel panel = new JPanel(rl); 
panel.add(...); 
+0

Certo, ho provato l'allineamento verticale ma non ha funzionato :( – mrpaint

+0

Che cosa non funziona? Ho dato due suggerimenti ed entrambi funzionano. Hai letto il tutorial Swing su "Come usare il layout della casella "Se hai bisogno di ulteriore aiuto pubblica il tuo SSCCE: http: // sscce.org – camickr

+0

Infine, ho esteso il FlowLayout per farlo funzionare come voglio ed è piuttosto bello ora: basta espandere la larghezza: D Grazie mille – mrpaint

Problemi correlati