জাভাতে কোনও স্ট্রিংয়ের ডিসপ্লে প্রস্থের গণনা করুন


91

জাভাতে কোনও স্ট্রিংয়ের দৈর্ঘ্য (পিক্সেলগুলিতে) গণনা করব কীভাবে?

সুইং ব্যবহার না করেই পছন্দনীয়।

সম্পাদনা: আমি জাভা 2 ডি-তে ড্র স্ট্রিং () ব্যবহার করে স্ট্রিংটি আঁকতে চাই এবং শব্দ মোড়ানোর জন্য দৈর্ঘ্যটি ব্যবহার করতে চাই।


4
দোল ছাড়া? আপনি কোন ডিভাইস ব্যবহার করছেন? কি ফন্ট? কি আকার? কি স্টাইল? এই সমস্ত জিনিস প্রদর্শন প্রস্থ পরিবর্তন করে।
এস .লট

4
আপনি স্ট্রিং আঁকতে যাচ্ছেন? এডাব্লুটি দিয়ে? বা অন্য কিছু টুলকিট দিয়ে? পিক্সেলগুলিতে স্ট্রিংয়ের আকারটি অঙ্কন এপিআইয়ের উপর নির্ভর করে যা পরে পিক্সেলটি আঁকবে (এবং অবশ্যই আপনি কোন ফন্টটি ব্যবহার করেন এবং কোন ফন্টের আকার এবং ফন্টটি যদি সাহসী / তির্যক হয় ইত্যাদি)। ডায়ালিং এপিআই এবং ফন্টের বৈশিষ্ট্যগুলি জানার জন্য ডাব্লু / ও, স্ট্রিংয়ের কোনও আকার নেই।
মক্কি

4
@ এস। লট আপনি এটি এক আছে। আমি এটি একটি প্রশ্নবিহীন হিসাবে বন্ধ করতে প্রলুব্ধ হয়েছিল।
ডেভিড আরনো

4
@ ডেভিড আরনো: আমি n00bz এর একটি সফি। আমি [শিক্ষানবিশ] ট্যাগ যুক্ত করব।
এস .লট

.NET সমতুল্য জন্যে রয়েছে TextRenderer ক্লাস হয় দেখতে stackoverflow.com/questions/604298/...
Spoike

উত্তর:


137

আপনি যদি কেবল এডাব্লুটি ব্যবহার করতে চান, তবে Graphics.getFontMetricsএকটি পেতে FontMetricsএবং তারপরে FontMetrics.stringWidthনির্দিষ্ট স্ট্রিংয়ের প্রশস্ততা সন্ধান করার জন্য (একটি অপ-ডিফল্টর জন্য ফন্ট নির্দিষ্ট করে) ব্যবহার করুন the

উদাহরণস্বরূপ, আপনার যদি Graphicsভেরিয়েবল বলা হয় তবে আপনি এটি gব্যবহার করতে পারবেন:

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

অন্যান্য টুলকিটগুলির জন্য, আপনাকে আমাদের আরও তথ্য সরবরাহ করতে হবে - এটি সর্বদা টুলকিট-নির্ভর হয়ে উঠবে।


8
আপনি যদি উদাহরণের ব্যবহার সরবরাহ করেন তবে এটি আরও পরিষ্কার হতে পারে, প্রথমদিকে আমি এটি স্ট্যাটিক পদ্ধতি হিসাবে ব্যবহার করার চেষ্টা করেছি, যেমন আপনি এটি লিখেছেন।
অ্যাকুইটাস

অবমানিত! তবে এখনও সর্বোত্তম পদ্ধতি !, যখন আরও ভাল উপায় না থাকে তারা কেন কোনও পদ্ধতির অবমূল্যায়ন করে !!! আমি ঠিক এটি পাই না!
ইমান

4
@ জিচ: আমি নিশ্চিত নই যে আপনি যে পদ্ধতিটি বলছেন তা হ্রাস করা হয়েছে - এগুলির কোনওটিই জাভা 8 নথিভুক্ত হিসাবে চিহ্নিত করা যায় না হিসাবে চিহ্নিত করা হয়েছে ...
জন স্কিটি

4
@ জিচ: এটি একটি পদ্ধতি Graphics, না FontMetrics। তবে আপনি ফোন করছেন Toolkit.getFontMetrics, যা প্রকৃতপক্ষে অবহেলিত, এবং যা এই পদ্ধতির কথা বলে না ... আপনার এই ধরণের বিষয়ে বিশেষত যত্নবান হওয়া দরকার, বিশেষত আপনি বাগ রিপোর্টিংয়ের বিষয়ে কথা বলা শুরু করার আগে ...
জোন স্কিট

4
@ জিচ: ভাল আমি অনুমান করব না - আমি অ-অবহিত পদ্ধতি, বা Toolkit.getFontMetricsপরিবর্তে প্রস্তাবিত নন-অবহিত পদ্ধতি ব্যবহার করব।
জন স্কিটি

55

এটি সর্বদা টুলকিট-নির্ভরশীল হওয়ার প্রয়োজন হয় না বা ফন্টমেট্রিক্স পদ্ধতির ব্যবহারের প্রয়োজন হয় না কারণ এটির জন্য প্রথমে কোনও গ্রাফিক্স অবজেক্ট গ্রহণ করা প্রয়োজন যা একটি ওয়েব ধারক বা শিরোনামহীন পরিবেশে অনুপস্থিত।

আমি এটি একটি ওয়েব সার্লেটে পরীক্ষা করেছি এবং এটি পাঠ্যের প্রস্থ গণনা করে।

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

কোনও প্রয়োজনীয় মার্জিন তৈরি করতে এই মাত্রাগুলিতে প্রয়োজনীয় মান যুক্ত করুন।


4
আমি মনে করি না এইভাবে একটি অ্যাফাইন ট্রান্সফর্ম এবং একটি ফন্টরেন্ডারকন্টেক্সট তৈরি করা ভাল আচরণের ফলে তৈরি হবে। আমি অনুমান করি ফন্ট.গেট ট্রান্সফ্রোম () আরও যুক্তিযুক্ত হবে।
লিথ

4
আপনার উদাহরণ এখনও এডব্লিউটি কার্যকারিতা ব্যবহার করে। উদাহরণস্বরূপ, এসডাব্লুটি ফন্টের সাহায্যে এটি কাজ করে না, এ কারণেই "এটি সর্বদা
হাতিয়ার

4
@ অলোফু মার্ক - গেটস্ট্রিংবাউন্ডগুলি কেবল যৌক্তিক সীমানা দেয়। এটিকে আরও ভাল করার জন্য আসেন + ডেসেন্ট সহ প্রকৃত উচ্চতা পুনরুদ্ধার করতে গেটবাউন্ডস () এবং লাইনমেট্রিক্স অবজেক্ট ব্যবহার করা উচিত।
জোনস

8

নিম্নলিখিত শ্রেণিতে 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();
  }

}

1

এবং এখন সম্পূর্ণ ভিন্ন কিছু জন্য । নিম্নলিখিতটি আরিয়াল হরফ ধরে নিয়েছে এবং অক্ষর বনাম প্রস্থের লিনিয়ার ইন্টারপোলেশনের উপর ভিত্তি করে একটি বন্য অনুমান করে।

// Returns the size in PICA of the string, given space is 200 and 'W' is 1000.
// see https://p2p.wrox.com/access/32197-calculate-character-widths.html

static int picaSize(String s)
{
    // the following characters are sorted by width in Arial font
    String lookup = " .:,;'^`!|jl/\\i-()JfIt[]?{}sr*a\"ce_gFzLxkP+0123456789<=>~qvy$SbduEphonTBCXY#VRKZN%GUAHD@OQ&wmMW";
    int result = 0;
    for (int i = 0; i < s.length(); ++i)
    {
        int c = lookup.indexOf(s.charAt(i));
        result += (c < 0 ? 60 : c) * 7 + 200;
    }
    return result;
}

আকর্ষণীয়, তবে সম্ভবত খুব ব্যবহারিক নয়।


1

আমি মাল্টিলাইন স্ট্রিং এরিয়াটি গণনা করতে ব্যক্তিগতভাবে কিছু সন্ধান করছিলাম, তাই নির্দিষ্ট ফন্ট সংরক্ষণ করে - নির্দিষ্ট ক্ষেত্রটি স্ট্রিং মুদ্রণের জন্য যথেষ্ট বড় কিনা তা আমি নির্ধারণ করতে পারি।

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;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.