2013-07-12 2 views
7

Ich habe ein mehrzeiliges Etikett, dessen Text eine Chance zum Überlauf hat. Wenn dies der Fall ist, möchte ich die Schriftgröße verringern, bis sie nicht überläuft oder bis sie eine Mindestgröße erreicht. Dies würde hoffentlich dazu führen, dass die Beschriftung die Größe ändert, bis die gesamte Zeichenfolge sichtbar ist.Test für Etikettenüberlauf

Mein Problem, dass ich nicht sicher bin, wie man prüft, um zu sehen, ob der Text übergelaufen ist. Ich habe versucht zu prüfen, ob der Text des Etiketts mit der Ellipse-Zeichenfolge endet, aber ich glaube, dass die Ellipse technisch nicht zur textProperty des Etiketts hinzugefügt wird. Kennt also jemand eine gute Möglichkeit, dies zu testen?

+0

Bump, ich will das wissen auch ... – Warkst

+0

prüfen auch diese http://stackoverflow.com/a/35065526 –

Antwort

3

Die kurze und enttäuschende Antwort: Sie können dies nicht auf zuverlässige Weise tun.

Die etwas längere Antwort ist, dass das Etikett selbst nicht weiß, ob es überflogen ist oder nicht. Wenn die Größe eines Labels geändert wird, ist die Skinklasse (LabeledSkinBase) für die Aktualisierung des angezeigten Texts zuständig. Diese Klasse verwendet jedoch eine JavaFX-utils-Klasse, um den ellipsoiden Text zu berechnen. Das Problem hierbei ist, dass die entsprechende Methode nur eine Ellipsoid-Zeichenfolge zurückgibt, wenn dies für die Bemaßungen der Beschriftung erforderlich ist. Die Haut selbst wird nie darüber informiert, ob der Text tatsächlich ellipsoid ist oder nicht, sie aktualisiert lediglich den angezeigten Text zum zurückgegebenen Ergebnis.

Sie können versuchen, den angezeigten Text der Hautklasse zu überprüfen, aber es ist geschützt. Also würden Sie tun müssen, ist LabelSkin Unterklasse, und implementieren so ähnlich:

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

Wenn Sie Skin verwenden für Sie beschriften, sollten Sie in der Lage sein zu erkennen, ob Ihr Text ellipsoided wird. Wenn du dich über die Schleife und die Reflektion wunderst: Java erlaubte mir nicht, auf andere Weise auf das Textfeld zuzugreifen, also könnte das ein starker Hinweis darauf sein, dass du das wirklich nicht machen solltest ;-) Trotzdem: Es funktioniert!

Haftungsausschluss: Ich habe nur überprüft für JavaFX 8