Java旋转文本具有反转字符序列

时间:2013-01-28 19:18:47

标签: java text awt graphics2d

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没有问题。

导致这种情况的原因是什么?

5 个答案:

答案 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

的旋转