2008-11-03 16 views
72

जावा में स्ट्रिंग की लंबाई (पिक्सेल में) की गणना कैसे करें?जावा में स्ट्रिंग की प्रदर्शन चौड़ाई की गणना करें

स्विंग का उपयोग किए बिना पसंदीदा।

संपादित करें: मैं Java2D में drawString() का उपयोग करके स्ट्रिंग को आकर्षित करना चाहता हूं और शब्द रैपिंग के लिए लंबाई का उपयोग करना चाहता हूं।

+4

? आप किस डिवाइस का उपयोग कर रहे हैं? क्या फ़ॉन्ट? कौन सा आकार? क्या स्टाइल है? ये सभी चीजें प्रदर्शन चौड़ाई बदलती हैं। –

+1

@ एस। लोट। आपके पास यह एक है। मैं इसे एक गैर-प्रश्न के रूप में बंद करने का लुत्फ उठा रहा था। –

+1

@ डेविड अरनो: मैं n00bz पर एक softie हूँ। मैं [शुरुआती] टैग जोड़ूंगा। –

उत्तर

108

तुम सिर्फ AWT उपयोग करना चाहते हैं, तो Graphics.getFontMetrics का उपयोग करें (वैकल्पिक रूप से एक गैर-डिफ़ॉल्ट एक के लिए, फ़ॉन्ट को निर्दिष्ट) एक FontMetrics और फिर FontMetrics.stringWidth निर्दिष्ट स्ट्रिंग के लिए चौड़ाई को खोजने के लिए मिलता है।

उदाहरण के लिए, यदि आप एक Graphics चर g कहा जाता है, तो आप का उपयोग करेंगे:

int width = g.getFontMetrics().stringWidth(text); 

अन्य उपकरणकिटें के लिए, आप हमें अधिक जानकारी की आवश्यकता होगी - यह हमेशा टूलकिट पर निर्भर होने के लिए जा रहा है ।

+6

यदि आप उदाहरण का उपयोग प्रदान करते हैं तो यह स्पष्ट हो सकता है, शुरुआत में मैंने इसे एक स्थिर विधि के रूप में उपयोग करने का प्रयास किया, जैसा कि आपने इसे लिखा है। – Aequitas

+0

बहिष्कृत! लेकिन अभी भी सबसे अच्छी विधि है !, एक बेहतर तरीके से नहीं होने पर वे एक विधि को क्यों हटाते हैं !!! मुझे यह बिलकुल समझ में नहीं आया! – Zich

+2

@ ज़ीच: मुझे यकीन नहीं है कि आप कौन सी विधि कह रहे हैं उसे बहिष्कृत किया गया है - उनमें से कोई भी जावा 8 दस्तावेज़ में बहिष्कृत के रूप में चिह्नित नहीं है, जहां तक ​​मैं देख सकता हूं ... –

38

इसे हमेशा टूलकिट-निर्भर होने की आवश्यकता नहीं होती है या किसी को हमेशा फ़ॉन्टमैट्रिक्स दृष्टिकोण का उपयोग करने की आवश्यकता नहीं होती है क्योंकि इसे पहले एक ग्राफिक्स ऑब्जेक्ट प्राप्त करने की आवश्यकता होती है जो किसी वेब कंटेनर में अनुपस्थित है या एक हेडलेस वातावरण में अनुपस्थित है।

मैंने इसे वेब सर्वलेट में परीक्षण किया है और यह टेक्स्ट चौड़ाई की गणना करता है।

import java.awt.Font; 
import java.awt.font.FontRenderContext; 
import java.awt.geom.AffineTransform; 

... 

String text = "Hello World"; 
AffineTransform affinetransform = new AffineTransform();  
FontRenderContext frc = new FontRenderContext(affinetransform,true,true);  
Font font = new Font("Tahoma", Font.PLAIN, 12); 
int textwidth = (int)(font.getStringBounds(text, frc).getWidth()); 
int textheight = (int)(font.getStringBounds(text, frc).getHeight()); 

किसी भी आवश्यक मार्जिन बनाने के लिए इन आयामों के लिए आवश्यक मान जोड़ें।

+1

मुझे नहीं लगता कि एक affineTransform बनाने और एक फ़ॉन्टरेंडर कॉन्टेक्स्ट इस तरह से एक अच्छा व्यवहार होगा। मुझे लगता है font.getTransfrom() अधिक तार्किक होगा। – Lyth

+1

आपका उदाहरण अभी भी एडब्ल्यूटी कार्यक्षमता का उपयोग कर रहा है। एसडब्ल्यूटी फ़ॉन्ट के साथ, उदाहरण के लिए, यह काम नहीं करेगा, यही कारण है कि "यह हमेशा टूलकिट-निर्भर होने वाला है" –

+1

@ ओलोफू मार्क - getStringBounds केवल तार्किक सीमाएं देता है। इसे बेहतर बनाने के लिए इसे वास्तविक ऊंचाई को पुनर्प्राप्त करने के लिए getBounds() और LineMetrics ऑब्जेक्ट का उपयोग करना चाहिए, जिसमें चढ़ाई + वंश शामिल है। – Jones

7

निम्नलिखित कक्षा में getWidth विधि का उपयोग करें:

import java.awt.*; 
import java.awt.geom.*; 
import java.awt.font.*; 

class StringMetrics { 

    Font font; 
    FontRenderContext context; 

    public StringMetrics(Graphics2D g2) { 

    font = g2.getFont(); 
    context = g2.getFontRenderContext(); 
    } 

    Rectangle2D getBounds(String message) { 

    return font.getStringBounds(message, context); 
    } 

    double getWidth(String message) { 

    Rectangle2D bounds = getBounds(message); 
    return bounds.getWidth(); 
    } 

    double getHeight(String message) { 

    Rectangle2D bounds = getBounds(message); 
    return bounds.getHeight(); 
    } 

} 
0

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

मुझे आशा है कि यह सुरक्षित एक और पुरुष जो जावा में इसी तरह के काम करने के लिए चाहते हो सकता है कुछ समय के लिए तो बस समाधान साझा करना चाहते थे होगा:

private static Hashtable hash = new Hashtable(); 
private Font font; 
private LineBreakMeasurer lineBreakMeasurer; 
private int start, end; 

public PixelLengthCheck(Font font) { 
    this.font = font; 
} 

public boolean tryIfStringFits(String textToMeasure, Dimension areaToFit) { 
    AttributedString attributedString = new AttributedString(textToMeasure, hash); 
    attributedString.addAttribute(TextAttribute.FONT, font); 
    AttributedCharacterIterator attributedCharacterIterator = 
      attributedString.getIterator(); 
    start = attributedCharacterIterator.getBeginIndex(); 
    end = attributedCharacterIterator.getEndIndex(); 

    lineBreakMeasurer = new LineBreakMeasurer(attributedCharacterIterator, 
      new FontRenderContext(null, false, false)); 

    float width = (float) areaToFit.width; 
    float height = 0; 
    lineBreakMeasurer.setPosition(start); 

    while (lineBreakMeasurer.getPosition() < end) { 
     TextLayout textLayout = lineBreakMeasurer.nextLayout(width); 
     height += textLayout.getAscent(); 
     height += textLayout.getDescent() + textLayout.getLeading(); 
    } 

    boolean res = height <= areaToFit.getHeight(); 

    return res; 
} 
स्विंग के बिना
संबंधित मुद्दे