2013-07-12 111 views
7

我有一個多行標籤,其文本有可能超出範圍。如果是這樣,我想減小字體大小,直到它不超出,或者直到它達到最小尺寸。這將有希望使標籤將改變大小,直到整個字符串可見。檢測標籤溢出

我的問題,我不知道如何測試,看看文本是否超限。我試過測試標籤的文本是否以橢圓字符串結尾,但我相信這個橢圓在技術上並沒有添加到標籤的textProperty中。那麼是否有人知道測試此方法的好方法?

+0

跳車,我想知道這個問題,以及... – Warkst

+0

檢查也是這個http://stackoverflow.com/a/35065526 –

回答

3

簡短和令人失望的答案:你根本無法以可靠的方式做到這一點。

稍微長一點的答案是,標籤本身甚至不知道它是否飛越了。每當標籤被調整大小時,皮膚類(LabeledSkinBase)負責更新顯示的文本。但是,該類使用JavaFX utils類來計算橢球文本。這裏的問題是,如果標籤的尺寸要求這樣,那麼相應的方法只返回一個橢圓體的字符串。皮膚本身從不知道文本是否實際上是橢圓形的,它只是將顯示的文本更新爲返回的結果。

你可以嘗試的是檢查皮膚類的顯示文本,但它是受保護的。所以,你需要做的是細分LabelSkin,並實施類似的東西:

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

如果您對您標籤使用這個皮膚,你應該能夠檢測到您的文字是否ellipsoided。如果你想知道循環和反思:Java不允許我通過其他方式訪問文本字段,所以這可能是一個強烈的指示器,你真的不應該這樣做;-)儘管如此:它的工作原理!

免責聲明:我只檢查了JavaFX的8