2013-07-12 15 views
7

Mam etykietę wielowierszową, której tekst ma szansę na przekroczenie. Jeśli to robi, chcę zmniejszyć rozmiar czcionki, dopóki nie zostanie przekroczony lub dopóki nie osiągnie minimalnego rozmiaru. Miejmy nadzieję, że tak się stanie, że etykieta zmieni rozmiar, dopóki cały ciąg nie będzie widoczny.Test przekroczenia etykiety

Mój problem polega na tym, że nie jestem pewien, jak przetestować, czy tekst został przekroczony. Próbowałem sprawdzić, czy tekst etykiety kończy się ciągiem elipsy, ale uważam, że elipsa nie została technicznie dodana do właściwości text etykiety. Czy ktoś wie o dobrym sposobie sprawdzania tego?

+0

Bump, chcę o tym wiedzieć, jak dobrze ... – Warkst

+0

Sprawdź również ten http://stackoverflow.com/a/35065526 –

Odpowiedz

3

Krótka i rozczarowująca odpowiedź: Po prostu nie można tego zrobić w wiarygodny sposób.

Nieco dłuższa odpowiedź brzmi, że sama etykieta nie wie nawet, czy jest nadpisana, czy nie. Po zmianie rozmiaru etykiety za aktualizację wyświetlanego tekstu odpowiada klasa skóry (LabeledSkinBase). Ta klasa używa klasy narzędziowej JavaFX do obliczania elipsoidalnego tekstu. Problem polega na tym, że odpowiednia metoda po prostu zwraca ciąg, który jest elipsoidalny, jeśli jest to wymagane przez wymiary etykiety. Skóra sama w sobie nigdy nie otrzymuje informacji o tym, czy tekst został faktycznie elipsoidowany, czy nie, po prostu aktualizuje wyświetlany tekst do zwróconego wyniku.

Możesz spróbować sprawdzić wyświetlany tekst klasy skóry, ale jest ona chroniona. Więc trzeba by zrobić, to podklasy LabelSkin i zaimplementować coś takiego:

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()); 
    } 
} 

przypadku korzystania z tej skóry dla ciebie etykiety, powinieneś być w stanie wykryć, czy tekst jest ellipsoided. Jeśli zastanawiasz się nad pętlą i refleksją: Java nie pozwoliła mi na dostęp do pola tekstowego w inny sposób, więc może to być silny wskaźnik, że naprawdę nie powinieneś tego robić ;-) Niemniej jednak: Działa!

Zastrzeżenie: Sprawdziłem tylko dla JavaFX 8

Powiązane problemy