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

文字は正しく回転しますが、2 番目の文字は最初の文字の下 (回転したスペースの右側) ではなく、上 (左) にあり、3 番目の文字は上 (の左) にあります。 2 番目など。回転角度を 45 度に変更すると、予想どおり、各文字が時計回りに 45 度回転しますが、文字の行は反時計回りに 45 度回転します。これは、両方の回転が 90 度の結果に向かって途中であることと一致しています。 .

0 度の回転では、テキストは正しく表示されます。

Mac OS X 10.8.2 で NetBeans 7.1.2 を使用して開発しています。Win 7 SP1 上の同じバージョンの NetBeans には問題はありません。

何が原因でしょうか?

4

5 に答える 5

1

以下の user1181445 によって投稿された AffineTransformation の方法は、最新の Java OSX アップデート (バージョン 7、アップデート 55) まで、問題のある OSX を含むすべてのプラットフォームで機能していました。回転したテキストが台無しになりましたが、アプレットのみです。アプリのスタンドアロン バージョンに問題はありません。

于 2014-04-22T16:40:05.690 に答える
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

私たちは同じことを見ています。JRE 6 および 7 のほとんどのバージョンにまたがる Windows で適切に機能するコードがあります。今日の同じコードは、文字が逆に回転する問題を示していました。問題の JRE バージョンは、OS X では 1.6.0_37 です。以前は OS X で動作していた可能性があります。99.9% のユーザーが Windows を使用しています。

回避策の 1 つは、テキストを BufferedImage にレンダリングしてから、画像を回転させることです。これは、テキストを 20 度から 30 度ほど回転させたときに視覚的により良い結果を得るために私が使用した方法です。

于 2013-01-29T20:45:54.887 に答える
0

私が今見ることができるものからうまくいくことができる2つのことがあります。

最初は String を char 配列に分割し、回転後にフォント サイズを 1 ずつインクリメント (太字の場合は +1 または 2) して、上から下に並べます。

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 の回転になります。

于 2013-01-28T19:35:56.047 に答える