2013-01-28 7 views
6

をシーケンス:Javaの回転テキストが反転した文字は、私がこれをやっている<code>JPanel</code>のサブクラスでは

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D)g;   
    g2d.rotate(Math.toRadians(90.)); 
    g2d.drawString(aString, 40, -40); 
} 

文字が正しく回転しているが、2番目の1は最初の下の予想位置にない(にその(左に)、3番目が第2などの上に(左に)あります。回転角度を45度に変更すると、各文字が45度回転し、文字の行は45度ccw回転しており、両方の回転が90度の結果の途中に一致しています。

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

Mac OS X 10.8.2でNetBeans 7.1.2を開発中です。 Win 7 SP1に同バージョンのNetBeansに問題はありません。

この原因は何ですか?

+0

私は無粋ソリューションは最初のプラットフォームをチェックする場合は、それは、少しので、実用的なだけでテキストを回転する方が効率的だと思います。回転の前にdrawStringを呼び出すことができます。 –

+0

それからそれらは正しく整列しません。 –

+0

Windowsで動作するという事実は、OS X Javaのバグを示唆しています。 Java2Dデモを実行してTransformsタブを表示しても、同様の問題がありますか? (Java2Dは、別途ダウンロード可能なJDKの「demos and samples」パッケージのdemo/jfc/Java2Dにあります.www.oracle.com/technetwork/java/javase/downloads/から入手できます) – VGR

答えて

0

今私が見ることのできる2つのことがあります。

最初に文字列をchar配列に分割し、回転が1行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 *パイ

+0

両方とも面白い解決策です症状を修正するために、私はまだ誰かが原因を特定できるかどうか疑問に思っています。 – eclux

+0

グラフィックスを回転しても、レンダリングされていないものは変更されないためです。文字列を回転させる前に(あなたが見るべきである)文字列を読むことはできません。 –

1

私たちは、同じものを見ているだろう。私たちは、JRE 6と7のほとんどのバージョンにまたがるWindows上でうまくいくコードを持っています。同じコードは、今日、回転した後方文字の問題を示しました。問題のJREバージョンは、OS Xでは1.6.0_37です。以前はOS Xで動作していたかどうかはわかりません。ユーザの99.9%がWindows上にあります。

1つの回避策は、テキストをBufferedImageにレンダリングし、イメージを回転させることです。それは私が20〜30度程度のテキストを回転させるために視覚的に良い結果を得るために使用した方法です。されたFontRenderContextでtrueにアンチエイリアシングを設定し、いくつかの理由で、私はこの問題の奇妙な解決策を見つけた

2

(つまり、バグの奇数判定と一致する)

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

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

は、それが正しく動作するようになります。誰かがレンダリングコードのどこかにマイナス記号を見つけていないか、またはそれらが書いていた仕様を誤解しているようです。

1

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

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); 
    } 
関連する問題