2011-11-01 22 views
14

In Java quando il testo della JLabel non può essere visualizzato a causa della mancanza di spazio, il testo viene troncato e alla fine viene aggiunto "...".scoprire se il testo di JLabel supera la dimensione dell'etichetta

Come faccio a sapere se attualmente JLabel visualizza il testo completo o il troncato?


EDIT:

vedo che c'è un modo per scoprire le dimensioni del testo utilizzando FontMetrics. Tuttavia questa soluzione non risponde completamente alla domanda. Nel caso in cui il testo di JLabel contenga decorazioni HTML, lo metrics.stringWidth() calcola anche la larghezza dei tag HTML. Quindi potrebbe succedere che il risultato di metrics.stringWidth() sia superiore alla larghezza di JLabel, ma il testo sarebbe comunque visualizzato correttamente.

C'è un modo per sapere quale decisione ha preso JLabel stessa durante la visualizzazione del testo. Ha deciso di troncare il testo o meno.

risposta

8

L'ellissi è aggiunto da UI delegato della griffe, tipicamente una sottoclasse di BasicLabelUI, come parte della sua struttura e taglia preferito. Il metodo layoutCL() può essere sovrascritto per esaminare la geometria, come mostrato in questo example.

In pratica, ignorerei l'elisione e mostrerò il testo completo in un suggerimento.

+2

'mostra il testo completo in un tool tip. Questo è quasi quello che sto cercando di fare. Se il testo viene troncato per mostrare il testo completo nel suggerimento. – jutky

+1

Grazie mille. Questa è una soluzione molto elegante. – jutky

+1

Buona chiamata sul tooltip, ora lo sto usando. –

5

da Oracle - Measuring Text:

// get metrics from the graphics 
FontMetrics metrics = graphics.getFontMetrics(font); 
// get the height of a line of text in this font and render context 
int hgt = metrics.getHeight(); 
// get the advance of my text in this font and render context 
int adv = metrics.stringWidth(text); 
// calculate the size of a box to hold the text with some padding. 
Dimension size = new Dimension(adv+2, hgt+2); 

Confronta size alle dimensioni del JLabel.getSize();

+0

E se si desidera garantire che tutto il testo verrà visualizzato dall'etichetta (nessun tronco)? Come posso garantirlo senza impostare esplicitamente la dimensione di JLabel con setXXXSize? – Heisenbug

+0

Mi sembra impossibile. Insignificante, se hai un'etichetta larga 10 px e il testo è l'opera completa di Shakespeare, ci sarà qualche troncamento a meno che tu non modifichi la dimensione della JLabel. – Kane

+0

@Heisenburg: si calcola la dimensione del testo come descritto da Oracle, quindi si utilizza il metodo setPreferredSize per impostare la JLabel. Dovrai calcolare le costanti di riempimento appropriate nella 4a linea per una JLabel. –

1

Il modo normale per eseguire questa operazione consiste nell'utilizzare un metodo che calcola la dimensione prevista del testo così come verrà visualizzata nell'etichetta. Se si sta utilizzando un font a spaziatura fissa, questo è facile:

lengthOfChar * numChars 

Se non stai utilizzando un font a spaziatura fissa, è ovviamente molto più difficile. Penso che ci siano alcune utility in giro che tenteranno di calcolarlo.

Una volta ottenuta la dimensione della stringa visualizzata, è possibile confrontare la lunghezza della JLabel e verificare se l'etichetta è troppo piccola.

4

Suppongo che se la dimensione preferita del componente è maggiore della dimensione effettiva, è possibile prevedere il troncamento. Affinché questo funzioni, naturalmente, il componente deve essere già realizzato.

+1

Non ne sono sicuro. Se imposto la dimensione preferita più grande di quella necessaria per visualizzare completamente il testo, è possibile che la dimensione effettiva sia inferiore a quella preferita, ma il testo non viene troncato. – jutky

+0

@jutky, non è consigliabile impostare in modo esplicito la dimensione preferita. È qualcosa che dovresti lasciare al gestore del layout. – mre

+0

Quindi, come devo limitare la dimensione dei componenti? Ho insegnato che questa è la dimensione preferita per. – jutky

3

Controllare this e vedere il metodo layoutCompoundLabel(). Restituisce una stringa che rappresenta il testo dell'etichetta. Puoi confrontarlo con l'originale per determinare se verrà ritagliato.

Jim S.

+0

Sembra buono, ma da dove ottengo i valori per viewR, iconR, variabili textR? – jutky

+0

Ho passato in label.getBounds() per tutti e tre e sembrava funzionare correttamente. –

0

Per ottenere dimensioni del testo html controllare questo https://www.java.net/node/665691.

View view = (View) javax.swing.plaf.basic.BasicHTML.createHTMLView(label, value.toString()); 
int width = (int) view.getPreferredSpan(View.X_AXIS); 
int height = (int) view.getPreferredSpan(View.Y_AXIS); 

L'unico piccolo problema è che potrebbe avere problemi con il testo non-html. Quindi, basta usare le metriche dei caratteri per le stringhe non html.Il seguente ha funzionato perfettamente per me:

if (value.toString().startsWith("<html>")) { 
    View view = (View) javax.swing.plaf.basic.BasicHTML.createHTMLView(label, value.toString()); 
    width = (int) view.getPreferredSpan(View.X_AXIS); 
} 
else { 
    width = (int) label.getFontMetrics(label.getFont()).stringWidth(value.toString()); 
} 
Problemi correlati