2012-04-30 10 views
3

私の質問はJava2Dでテキストを回転させる方法ではありません。私はそれを行う方法を知っています。私が知らないのは、回転したテキストを「見栄えよく」する方法です。たとえば、PowerPointでテキストボックスを作成して回転すると、回転角度に関係なくテキストがシャープで透明に表示されます。しかし、g2D.drawString()で描画されたテキストは、0度または90度で大丈夫ですが、他の角度ではそれほど良好ではありません。それをきれいにするか、または鋭くするためにテキストを操作する方法はありますか?もしそうなら、もし誰かが私にこのことをどうやって学ぶべきかを指摘できたら、私はとても感謝しています。回転したテキストをJava2Dでうまく見せる方法

以下は、私が何を話しているかを示す小さなプログラムです。大きなフォントは回転してもそれほど悪くはありませんが、まだまだプロフェッショナルではありません。回転すると小さなフォントがひどいです。

import java.awt.*; 
import java.awt.geom.*; 
import javax.swing.*; 

public class RotateTest extends JPanel { 
    String message = "How does this text look?"; 

    public RotateTest() { 
     this.setPreferredSize(new Dimension(640, 280)); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     Graphics2D g2D = (Graphics2D) g; 

     g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, 
         RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 

     g2D.setFont(new Font("MyriadPro", Font.BOLD, 20)); 
     g2D.drawString(message, 80, 20); 

     AffineTransform orig = g2D.getTransform(); 

     double angle = Math.toRadians(7.0); 
     g2D.rotate(-angle, -10, 80); 
     g2D.drawString(message, 80, 80); 
     g2D.setTransform(orig); 

     angle = Math.toRadians(30.0); 
     g2D.rotate(-angle, -40, 80); 
     g2D.drawString(message, 60, 260); 
     g2D.setTransform(orig); 

     g2D.setFont(new Font("MyriadPro", Font.BOLD, 12)); 
     g2D.drawString(message, 380, 20); 

     angle = Math.toRadians(7.0); 
     g2D.rotate(-angle, -10, 80); 
     g2D.drawString(message, 380, 120); 
     g2D.setTransform(orig); 

     angle = Math.toRadians(30.0); 
     g2D.rotate(-angle, -40, 80); 
     g2D.drawString(message, 320, 400); 
     g2D.setTransform(orig); 
    } 

    private void display() { 
     JFrame f = new JFrame("RotateTest"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.pack(); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new RotateTest().display(); 
      } 
     }); 
    } 
} 
+0

あなたが表示する任意のコードを持っています:

ここでは、コードですか? – mprabhat

答えて

6

私はかつて同様の問題を抱えていましたが、画像に高精度でテキストを描画して回転イメージを描画することで解決しました。

import java.awt.*; 
import java.awt.geom.*; 
import java.awt.image.BufferedImage; 

import javax.swing.*; 

public class RotatedText extends JPanel { 
    String message = "How does this text look?"; 

    public RotatedText() { 
     this.setPreferredSize(new Dimension(640, 280)); 
    } 

    public BufferedImage createStringImage(Graphics g, String s) { 
     int w = g.getFontMetrics().stringWidth(s) + 5; 
     int h = g.getFontMetrics().getHeight(); 

     BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); 
     Graphics2D imageGraphics = image.createGraphics(); 
     imageGraphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 
     imageGraphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); 
     imageGraphics.setColor(Color.BLACK); 
     imageGraphics.setFont(g.getFont()); 
     imageGraphics.drawString(s, 0, h - g.getFontMetrics().getDescent()); 
     imageGraphics.dispose(); 

     return image; 
    } 

    private void drawString(Graphics g, String s, int tx, int ty, double theta, double rotx, double roty) { 
     AffineTransform aff = AffineTransform.getRotateInstance(theta, rotx, roty); 
     aff.translate(tx, ty); 

     Graphics2D g2D = ((Graphics2D) g); 
     g2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); 
     g2D.drawImage(createStringImage(g, s), aff, this); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     g.setFont(new Font("MyriadPro", Font.BOLD, 20)); 

     drawString(g, message, 80, 20, 0, 0, 0); 
     drawString(g, message, 80, 80, -Math.toRadians(7.0), -10, 80); 
     drawString(g, message, 60, 260, -Math.toRadians(30.0), -40, 80); 

     g.setFont(new Font("MyriadPro", Font.BOLD, 12)); 

     drawString(g, message, 380, 20, 0, 0, 0); 
     drawString(g, message, 380, 120, -Math.toRadians(7.0), -10, 80); 
     drawString(g, message, 320, 400, -Math.toRadians(30.0), -40, 80); 
    } 

    private void display() { 
     JFrame f = new JFrame("RotateTest"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.pack(); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new RotatedText().display(); 
      } 
     }); 
    } 
} 
+0

それは本当にいいね。ありがとう!! –

0

私はこれをテストする時間を持っていないが、次のコードのヘルプ?:

Graphics2D g2d; 
g2d.setRenderingHints(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 

これが唯一のGraphics2D上で動作しますします。通常のGraphicsを使用している場合は、Graphicsオブジェクトを2D版にキャストできます。

Graphics2D g2d = (Graphics2D) g; //if Graphics object name is g. 

教えてください。 幸運

+0

バイロンに感謝...私はそれを試みましたが、回転されたテキストはまだ偉大に見えません(上記の私のサンプルコードを参照してください)。 –

+0

私はあなたのコードを試しました。私はあなたが持っている問題を見ています。正直なところ、なぜテキストが悪いように見えるのか分かりませんが、私の直感は、フォントと何かが関係しているローテーション –

+0

このサイトを見てみると、この例ではhttp://www.subbu.org/javaapps/rotate/RotateTextDemo.htmlはあなたのコードですか? (私のコードではなく、Graphics2Dではない) –

関連する問題