2011-08-18 21 views
15
Font font = Font("Arial", Font.BOLD, 35); 

JLabel label = new JLabel("57"); 
JPanel panel = new JPanel(); 
panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS)); 
panel.add(label); 

Questo crea una JLabel con uno spazio aggiuntivo sopra e sotto di esso. Ho provato setVerticalAlignment(SwingConstants.TOP) ma non funziona. Ancora una volta, non voglio allineare JLabel all'inizio, ma il testo all'interno di JLabel dovrebbe essere allineato in alto.JLabel allineamento verticale non funziona come previsto

ecco come la mia etichetta sembra enter image description here

+0

dimenticato una riga. label.setFont (font); – arpanoid

+0

La ragione probabile è che alcuni simboli si estendano verso l'alto oltre i numeri e l'allineamento del testo all'interno dell'etichetta, combinato con le dimensioni dell'etichetta, deve tenere conto di più metriche dei caratteri. http://upload.wikimedia.org/wikipedia/commons/3/39/Typography_Line_Terms.svg Non è una risposta alla tua domanda, ma potrebbe essere d'aiuto. –

+0

+1 per includere un'immagine; a parte, non trascurare il valore di ['RenderingHints'] (http://download.oracle.com/javase/6/docs/api/java/awt/RenderingHints.html). – trashgod

risposta

19

Il testo dell'etichetta è già allineato in alto. Anche se imposti tutti e tre i seguenti valori:

label.setVerticalAlignment(JLabel.TOP); 
label.setVerticalTextPosition(JLabel.TOP); 
panel.setAlignmentY(TOP_ALIGNMENT); 

si dovrebbe ancora trovare quel divario.

Il problema è correlato alla metrica dei caratteri. Il carattere lascia spazio ai segni diacritici, e mentre i numeri inglesi e persino le lettere non contengono segni diacritici in lettere maiuscole, Arial contiene sicuramente una vasta gamma di caratteri internazionali, compresi quelli più alti di una lettera maiuscola, ad esempio, dieresi tedesche (ÄÖÜ) o caratteri contenente segni diacritici portoghesi (ÁÂ).

Se si desidera una soluzione rapida e semplice che sia un trucco, che potrebbe non adattarsi bene ai caratteri e alle piattaforme, è possibile utilizzare un valore negativo su un bordo per compensare le metriche dei caratteri.

label.setBorder(BorderFactory.createEmptyBorder(-3 /*top*/, 0, 0, 0)); 

Se si vuole risolvere il problema "giusto" si dovrebbe esaminare l'apprendimento sul pacchetto FontMetrics, in quanto ha molte funzioni che potrebbero essere utili per calcolare l'altezza reale e la posizione del testo che viene visualizzato, in modo tale che puoi spostare l'intera stringa della giusta quantità di pixel.

+0

+1 Puoi commentare la relativa sicurezza di questa soluzione alternativa? – trashgod

+0

+1, Nice hack. Non ero consapevole del fatto che potresti utilizzare valori negativi. : D – mre

+0

Grazie .. ha funzionato. Disordinato però ....... – arpanoid

5

La freccia nei tuoi punti di diagramma per la differenza tra il nominale salita del glifo e la massima salita, come discusso in FontMetrics. Puoi armeggiare con setBorder(null); ma per un controllo assoluto, dovrai eseguire il rendering dei glifi da solo, come mostrato in here. Fortunatamente, i glifi digitali della maggior parte dei font hanno un'uniforme avanzata e ascesa.

+2

anche se si fa \t 'FontMetrics fontMetrics = label.getFontMetrics (font); int offset = fontMetrics.getMaxAscent() - fontMetrics.getAscent(); System.out.println (offset); 'utilizzando il suo codice di esempio con il font impostato su Arial, otterrai una differenza pari a zero. Questo è in realtà un bug noto (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6623223) che probabilmente non verrà risolto perché interrompe la compatibilità con le versioni precedenti ed è contrassegnato con una priorità così bassa. –

+0

Buona referenza, grazie! Aggiornato. – trashgod