6

在 a 的子类中,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 度,这与两个旋转都向结果的一半方向旋转 90 度一致.

在 0 度旋转时,文本正确显示。

我在 Mac OS X 10.8.2 上使用 NetBeans 7.1.2 进行开发。Win 7 SP1 上相同版本的 NetBeans 没有问题。

这可能是什么原因造成的?

4

5 回答 5

2

我为这个问题找到了一个奇怪的解决方案(与错误的奇怪性相匹配)

FontRenderContext frc = new FontRenderContext(g2.getTransform(), true, true);

g2.drawGlyphVector(currentFont.createGlyphVector(frc, aString), textX, textY);

出于某种原因,在 FontRenderContext 上将 anti-aliasing 设置为 true 会导致它正确运行。似乎有人在渲染代码的某处遗漏了一个减号,或者误解了他们编写的规范!

于 2013-11-23T23:57:07.580 回答
1

我们看到的是同样的事情。我们的代码在大多数 JRE 6 和 7 版本的 Windows 上运行良好。今天相同的代码展示了向后旋转的字符问题。问题 JRE 版本在 OS X 上是 1.6.0_37。它以前在 OS X 上可能工作过,也可能没工作过。我们 99.9% 的用户使用 Windows。

一种解决方法是将文本呈现为 BufferedImage,然后旋转图像。这是我用来在视觉上将文本旋转 20-30 度左右获得更好结果的方法。

于 2013-01-29T20:45:54.887 回答
1

在 OS X 10.10 与 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);
    }
于 2014-11-20T12:41:44.283 回答
1

下面 user1181445 发布的 AffineTransformation 方法适用于所有平台,包括有问题的 OSX,直到最近的 Java OSX 更新(版本 7,更新 55)。现在旋转的文本搞砸了,但只在小程序上。我在我们的应用程序的独立版本中没有看到问题。

于 2014-04-22T16:40:05.690 回答
0

There are 2 things that could work from what I can see right now.

The first would be to split the String into a char array, then after the rotate go 1-by-1 incrementing the font size (+1 or 2 if bolded) so that they line up, going top to bottom.

The second way would be to make your own font, which I wouldn't recommend. If you draw the String before the rotation, then when it rotates hypothetically if you made the font correctly it will display as it should.

If I can think of another way I will post it.

Edit:

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

So, to draw vertically that would be a rotate of 270 degrees, or 3/2 * pi

于 2013-01-28T19:35:56.047 回答