2013-07-12 11 views
7

Ho un'etichetta multilinea il cui testo ha la possibilità di eseguire un overrunning. In tal caso, desidero ridurre la dimensione del font fino a quando non si verifica un overrunning o finché non raggiunge dimensioni minime. Speriamo che questo accada in modo che l'etichetta cambierà dimensione fino a quando l'intera stringa non sarà visibile.Test per superamento dell'etichetta

Il mio problema è che non sono sicuro come testare per vedere se il testo ha superato. Ho provato a verificare se il testo dell'etichetta termina con la stringa dell'ellisse, ma credo che l'ellisse non sia tecnicamente aggiunta alla proprietà text dell'etichetta. Quindi qualcuno sa di un buon modo per testare per questo?

+0

Bump, voglio sapere anche questo ... – Warkst

+0

controllare anche questo http://stackoverflow.com/a/35065526 –

risposta

3

La risposta breve e deludente: semplicemente non è possibile farlo in modo affidabile.

La risposta leggermente più lunga è che l'etichetta stessa non sa nemmeno se è sorvolata o meno. Ogni volta che un'etichetta viene ridimensionata, la classe della pelle (LabeledSkinBase) è responsabile dell'aggiornamento del testo visualizzato. Questa classe, tuttavia, utilizza una classe utils JavaFX per calcolare il testo ellissoide. Il problema qui è che il rispettivo metodo restituisce semplicemente una stringa che è ellissoide se ciò è richiesto dalle dimensioni dell'etichetta. La pelle stessa non viene mai informata se il testo era effettivamente ellissoide o meno, ma aggiorna solo il testo visualizzato al risultato restituito.

Quello che potresti provare è controllare il testo visualizzato della classe skin, ma è protetto. Così si avrebbe bisogno di fare è di sottoclasse LabelSkin, e implementare qualcosa di simile:

package com.sun.javafx.scene.control.skin; 

import java.lang.reflect.Field; 

import javafx.scene.control.Label; 

@SuppressWarnings("restriction") 
public class TestLabel extends LabelSkin { 
    private LabeledText labelledText; 

    public TestLabel(Label label) throws Exception { 
    super(label); 

    for (Field field : LabeledSkinBase.class.getDeclaredFields()) { 
     if (field.getName().equals("text")) { 
     field.setAccessible(true); 
     labelledText = (LabeledText) field.get(this); 
     break; 
     } 
    } 
    } 

    public boolean isEllipsoided() { 
    return labelledText != null && labelledText.getText() != null && !getSkinnable().getText().equals(labelledText.getText()); 
    } 
} 

Se si utilizza questa pelle si etichetta, si dovrebbe essere in grado di rilevare se il testo è ellipsoided. Se ti chiedi del loop e del riflesso: Java non mi ha permesso di accedere al campo di testo con altri mezzi, quindi questo potrebbe essere un forte indicatore che non dovresti davvero farlo ;-) Tuttavia: Funziona!

Disclaimer: Ho controllato solo per JavaFX 8

Problemi correlati