জাভাতে কোনও স্ট্রিংয়ের দৈর্ঘ্য (পিক্সেলগুলিতে) গণনা করব কীভাবে?
সুইং ব্যবহার না করেই পছন্দনীয়।
সম্পাদনা: আমি জাভা 2 ডি-তে ড্র স্ট্রিং () ব্যবহার করে স্ট্রিংটি আঁকতে চাই এবং শব্দ মোড়ানোর জন্য দৈর্ঘ্যটি ব্যবহার করতে চাই।
জাভাতে কোনও স্ট্রিংয়ের দৈর্ঘ্য (পিক্সেলগুলিতে) গণনা করব কীভাবে?
সুইং ব্যবহার না করেই পছন্দনীয়।
সম্পাদনা: আমি জাভা 2 ডি-তে ড্র স্ট্রিং () ব্যবহার করে স্ট্রিংটি আঁকতে চাই এবং শব্দ মোড়ানোর জন্য দৈর্ঘ্যটি ব্যবহার করতে চাই।
উত্তর:
আপনি যদি কেবল এডাব্লুটি ব্যবহার করতে চান, তবে Graphics.getFontMetrics
একটি পেতে FontMetrics
এবং তারপরে FontMetrics.stringWidth
নির্দিষ্ট স্ট্রিংয়ের প্রশস্ততা সন্ধান করার জন্য (একটি অপ-ডিফল্টর জন্য ফন্ট নির্দিষ্ট করে) ব্যবহার করুন the
উদাহরণস্বরূপ, আপনার যদি Graphics
ভেরিয়েবল বলা হয় তবে আপনি এটি g
ব্যবহার করতে পারবেন:
int width = g.getFontMetrics().stringWidth(text);
অন্যান্য টুলকিটগুলির জন্য, আপনাকে আমাদের আরও তথ্য সরবরাহ করতে হবে - এটি সর্বদা টুলকিট-নির্ভর হয়ে উঠবে।
Graphics
, না FontMetrics
। তবে আপনি ফোন করছেন Toolkit.getFontMetrics
, যা প্রকৃতপক্ষে অবহেলিত, এবং যা এই পদ্ধতির কথা বলে না ... আপনার এই ধরণের বিষয়ে বিশেষত যত্নবান হওয়া দরকার, বিশেষত আপনি বাগ রিপোর্টিংয়ের বিষয়ে কথা বলা শুরু করার আগে ...
Toolkit.getFontMetrics
পরিবর্তে প্রস্তাবিত নন-অবহিত পদ্ধতি ব্যবহার করব।
এটি সর্বদা টুলকিট-নির্ভরশীল হওয়ার প্রয়োজন হয় না বা ফন্টমেট্রিক্স পদ্ধতির ব্যবহারের প্রয়োজন হয় না কারণ এটির জন্য প্রথমে কোনও গ্রাফিক্স অবজেক্ট গ্রহণ করা প্রয়োজন যা একটি ওয়েব ধারক বা শিরোনামহীন পরিবেশে অনুপস্থিত।
আমি এটি একটি ওয়েব সার্লেটে পরীক্ষা করেছি এবং এটি পাঠ্যের প্রস্থ গণনা করে।
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());
কোনও প্রয়োজনীয় মার্জিন তৈরি করতে এই মাত্রাগুলিতে প্রয়োজনীয় মান যুক্ত করুন।
নিম্নলিখিত শ্রেণিতে 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();
}
}
এবং এখন সম্পূর্ণ ভিন্ন কিছু জন্য । নিম্নলিখিতটি আরিয়াল হরফ ধরে নিয়েছে এবং অক্ষর বনাম প্রস্থের লিনিয়ার ইন্টারপোলেশনের উপর ভিত্তি করে একটি বন্য অনুমান করে।
// 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;
}
আকর্ষণীয়, তবে সম্ভবত খুব ব্যবহারিক নয়।
আমি মাল্টিলাইন স্ট্রিং এরিয়াটি গণনা করতে ব্যক্তিগতভাবে কিছু সন্ধান করছিলাম, তাই নির্দিষ্ট ফন্ট সংরক্ষণ করে - নির্দিষ্ট ক্ষেত্রটি স্ট্রিং মুদ্রণের জন্য যথেষ্ট বড় কিনা তা আমি নির্ধারণ করতে পারি।
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;
}