2013-07-12 7 views
7

मेरे पास एक मल्टीलाइन लेबल है जिसका टेक्स्ट ओवरराइजिंग का मौका है। यदि ऐसा होता है, तो मैं फ़ॉन्ट आकार को कम करना चाहता हूं जब तक कि यह अतिव्यापी न हो, या जब तक कि यह न्यूनतम आकार को हिट न करे। यह आशा करता है कि यह सुनिश्चित करे कि लेबल तब तक बदल जाएगा जब तक कि संपूर्ण स्ट्रिंग दिखाई न दे।लेबल ओवररन के लिए टेस्ट

मेरी समस्या यह है कि मुझे यह सुनिश्चित नहीं है कि टेक्स्ट को ओवररन करने के लिए यह जांचने के लिए कैसे परीक्षण किया जाए। मैंने यह देखने के लिए परीक्षण करने का प्रयास किया है कि लेबल का टेक्स्ट एलीपसे स्ट्रिंग के साथ समाप्त होता है, लेकिन मेरा मानना ​​है कि इलिप्स तकनीकी रूप से लेबल की टेक्स्टप्रॉपर्टी में नहीं जोड़ा गया है। तो क्या किसी को इसके परीक्षण के लिए एक अच्छा तरीका पता है?

+0

टक्कर, मैं इस रूप में अच्छी तरह जानना चाहता हूँ ... – Warkst

+0

चेक भी इस http://stackoverflow.com/a/35065526 –

उत्तर

3

संक्षिप्त और निराशाजनक उत्तर: आप बस इसे विश्वसनीय तरीके से नहीं कर सकते हैं।

थोड़ा लंबा जवाब यह है कि लेबल खुद को यह भी नहीं जानता कि यह अतिप्रवाह है या नहीं। जब भी एक लेबल का आकार बदलता है, त्वचा वर्ग (LabeledSkinBase) प्रदर्शित पाठ को अद्यतन करने के लिए ज़िम्मेदार है। हालांकि, यह वर्ग एलीपॉस्ड टेक्स्ट की गणना करने के लिए जावाएफएक्स यूटिल क्लास का उपयोग करता है। यहां समस्या यह है कि संबंधित विधि केवल एक स्ट्रिंग देता है जो लेबल के आयामों द्वारा आवश्यक होने पर ellipsoid है। त्वचा को कभी भी इस बारे में सूचित नहीं किया जाता है कि पाठ वास्तव में लंबित था या नहीं, यह केवल प्रदर्शित पाठ को प्रदर्शित किए गए पाठ को अपडेट करता है।

आप क्या कर सकते हैं त्वचा वर्ग के प्रदर्शित पाठ को जांचना है, लेकिन यह संरक्षित है।

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 रहा है या नहीं सक्षम होना चाहिए: तो तुम क्या करने की आवश्यकता होगी LabelSkin उपवर्ग, और ऐसा ही कुछ को लागू करने की है। यदि आप लूप और प्रतिबिंब के बारे में सोचते हैं: जावा ने मुझे अन्य क्षेत्रों से टेक्स्ट फ़ील्ड तक पहुंचने की अनुमति नहीं दी है, इसलिए यह एक मजबूत संकेतक हो सकता है कि आपको वास्तव में ऐसा नहीं करना चाहिए ;-) फिर भी: यह काम करता है!

अस्वीकरण: मैं केवल JavaFX 8 के लिए देख लिया है

संबंधित मुद्दे