在JPanel
的子类中,我这样做:
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
g2d.rotate(Math.toRadians(90.));
g2d.drawString(aString, 40, -40);
}
字母旋转正确,但第二个字母不在第一个字母下方的预期位置(在旋转空间中位于其右侧),但在其上方(在其左侧),第三个在上方(在左边的,第二个,等等。将旋转角度改为45度会导致每个字符旋转45度,如预期的那样,但是字符行旋转45度ccw,这与两个旋转中间的旋转一致90度。
旋转0度时,文字显示正确。
我正在使用Mac OS X 10.8.2上的NetBeans 7.1.2进行开发。 Win 7 SP1上的相同版本的NetBeans没有问题。
导致这种情况的原因是什么?
答案 0 :(得分:2)
我找到了一个针对这个问题的奇怪解决方案(与错误的奇怪性相匹配)
FontRenderContext frc = new FontRenderContext(g2.getTransform(), true, true);
g2.drawGlyphVector(currentFont.createGlyphVector(frc, aString), textX, textY);
由于某些原因,在FontRenderContext上将抗锯齿设置为true将导致它正常运行。似乎有人在渲染代码中的某处丢失了减号,或者误解了他们正在编写的规范!
答案 1 :(得分:1)
我们看到了同样的事情。我们的代码在Windows上运行良好,涵盖了大多数JRE 6和7版本。今天相同的代码展示了旋转后向字符问题。 OS X上的问题JRE版本是1.6.0_37。它可能在OS X上运行或者可能没有运行.99.9%的用户在Windows上。
一种解决方法是将文本渲染为BufferedImage,然后旋转图像。这是我用来获得更好结果的方法,可以将文本旋转20-30度左右。
答案 2 :(得分:1)
下面的user1181445发布的AffineTransformation方法适用于所有平台,包括有问题的OSX,直到最新的Java OSX更新(版本7,更新55)。现在旋转的文本搞砸了,但只在applet上。我的应用程序的独立版本中没有发现问题。
答案 3 :(得分:1)
在OS X 10.10 vs Windows 7上,我遇到了完全相同的问题,但反过来了!即在绘制垂直文本之前旋转整个图形上下文看起来很好,但将AffineTransform应用于新字体会产生奇怪的旋转文本。
我认为只旋转文本稍微有点效率,所以一个实用的,不优雅的解决方案是首先检查平台:
Font font = g.getFont();
if (System.getProperty("os.name").startsWith("Mac")) {
g.rotate(-Math.PI / 2, x, y);
g.drawString(string, x, y);
g.rotate(Math.PI / 2, x, y);
} else {
AffineTransform fontAT = new AffineTransform();
fontAT.rotate(-Math.PI / 2);
g.setFont(font.deriveFont(fontAT));
g.drawString(string, x, y);
g.setFont(font);
}
答案 4 :(得分:0)
现在我能看到的东西有两件事可行。
第一种方法是将String拆分为char数组,然后在旋转之后逐步增加字体大小(如果加粗则为+1或2),使它们排成一行,从上到下。
第二种方法是制作自己的字体,我不推荐。如果你在旋转之前绘制字符串,那么当它正确旋转时如果你正确地制作了字体,它将显示它应该显示。
如果我能想到另一种方式,我会发布它。
编辑:
final AffineTransform at = new AffineTransform();
final Font font = g.getFont();
// Derive a new font using a rotatation transform (Theta is angle in radians).
at.rotate(theta);
final Font newFont = font.deriveFont(at);
// set the derived font in the Graphics2D context
g2d.setFont(newFont);
// Render a label instance of type String using the derived font
g2d.drawString(label, x, y);
因此,垂直绘制将是270度或3/2 * pi
的旋转