JAVA2D中如何从右到左写字符串

时间:2022-09-05 21:53:27
我遇到的问题是在java2D里 需要右对齐字符串到一个Y坐标轴位置
比如:
1234567890
       ABC
      5_a?
但是正常的drawString方法都是 给出一个启示(x,y)坐标 然后从左往右画
public abstract void drawString(String str,int x,int y)
public abstract void drawString(AttributedCharacterIterator iterator,int x,int y)
第二个方法比较有意思 获得一个定义了很多属性的迭代器中读取字符 但是好像TextAttribute里面可以被设置的属性
还有Bidi类 但还是没有找到合适的方法 请问有没有遇到过相同问题的?

另外我尝试过一个不是很好的方法 统计字符个数 然后移动x坐标值 比如"ABC" 需要移动3乘以一个字符占用的宽度
可是相应的问题是不同字符画出来宽度肯定也都不同的 比如一个字符串"D.a@"每个字符占据的宽度是不一样的 所以我也不能得出一个统一的宽度。。。大家给点好建议 如果觉得这个可行

5 个解决方案

#1


。。。需要靠的那么精细么? 路过帮顶。。。

#2


如果需要你那么做的话 你可以先统计出不同字符的区别 然后再统计一个字符串中有多少那样的字符 大概吧

#3


不好这样做吧 
因为不好知道每个字符最后显示出来的具体宽度啊 字符多起来 小的偏差就被放大了最后

#4


ding~~~

#5


Font f = new Font("Helvetica", Font.BOLD, 12);
AttributedString ats = new AttributedString(comment.trim());
// ats.addAttribute(TextAttribute.RUN_DIRECTION,
// TextAttribute.RUN_DIRECTION_RTL);
ats.addAttribute(TextAttribute.FONT, f);
AttributedCharacterIterator iter = ats.getIterator();
if (isLeft) {
TextLayout textlayout = new TextLayout(iter, g2d
.getFontRenderContext());
int textWidth = (int) textlayout.getBounds().getWidth();
g2d.drawString(iter, getX() - textWidth - 5, getY()
+ height / 2);
} else
g2d.drawString(iter, getX() + width + 5, getY() + height
/ 2);
这个是答案 以后有同样问题的需要时候自己看吧


分也不能给自己 所以还是给2楼了吧

#1


。。。需要靠的那么精细么? 路过帮顶。。。

#2


如果需要你那么做的话 你可以先统计出不同字符的区别 然后再统计一个字符串中有多少那样的字符 大概吧

#3


不好这样做吧 
因为不好知道每个字符最后显示出来的具体宽度啊 字符多起来 小的偏差就被放大了最后

#4


ding~~~

#5


Font f = new Font("Helvetica", Font.BOLD, 12);
AttributedString ats = new AttributedString(comment.trim());
// ats.addAttribute(TextAttribute.RUN_DIRECTION,
// TextAttribute.RUN_DIRECTION_RTL);
ats.addAttribute(TextAttribute.FONT, f);
AttributedCharacterIterator iter = ats.getIterator();
if (isLeft) {
TextLayout textlayout = new TextLayout(iter, g2d
.getFontRenderContext());
int textWidth = (int) textlayout.getBounds().getWidth();
g2d.drawString(iter, getX() - textWidth - 5, getY()
+ height / 2);
} else
g2d.drawString(iter, getX() + width + 5, getY() + height
/ 2);
这个是答案 以后有同样问题的需要时候自己看吧


分也不能给自己 所以还是给2楼了吧