2013-02-08 4 views
0

현재 제가 직면 한 문제는 다음과 같습니다. Java2D를 사용하여 JPanel에 String을 그려야합니다. String은 사용자 정의 각도로 회전해야합니다.Mac에서 Java2D의 텍스트 회전

그 문자열에서 나는 또한 배경색을 페인트하여 (많은 다른 것들이 내 JPanel에서 그려진다) 주어진 색상으로 페인트한다.

이 리눅스에 매우 잘 작동하지만, 맥 OS X에
final Graphics2D g2 = (Graphics2D) g.create(); 

final int textWidth = g.getFontMetrics().stringWidth(textToDraw); 
final int textHeight = g.getFontMetrics().getHeight(); 

g2.translate(pointToDraw.x, pointToDraw.y); 
g2.rotate(angle); 

g2.setColor(textBackground); 
g2.fillRect(deltaX, -textHeight, textWidth, textHeight); 

g2.setColor(drawColor); 
g2.setFont(font); 
g2.drawString(textToDraw, deltaX, deltaY); 
g2.dispose(); 

이 (자바 1.6), 텍스트가 아닌 : 내 JPanel의의 오버라이드 (override) 페인트 방법, 무슨 짓을

은 다음과 같다 제대로 표시 : 텍스트가 올바르게 회전하지만 각 문자 뒤에 줄 바꿈이 있습니다.

어떻게 두 플랫폼에서 작동하게 할 수 있습니까?

는 나는 이것이 당신이 원하는 것 해결책이지만, 모든 것을에서 내가 읽을 수있었습니다, 더 나은 해결책이 될 수없는 것 생각하지 않는다

답변

1

...

문제가 될 것으로 보인다 맥은 각 문자, 단지 String

enter image description here

는 기본적으로, 내가 바람 피운 적이없는 회전된다. 이 텍스트를 렌더링하는 BufferedImage

public class RotateText { 

    public static void main(String[] args) { 
     new RotateText(); 
    } 

    public RotateText() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private String textToDraw = "Stack Overflow"; 
     private double angle = 90; 
     private Color drawColor = Color.BLACK; 

     public TestPane() { 
      Timer timer = new Timer(50, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        angle += 2; 
        repaint(); 
       } 
      }); 
      timer.setRepeats(true); 
      timer.setCoalesce(true); 
      timer.start(); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      final Graphics2D g2 = (Graphics2D) g.create(); 

      FontMetrics fm = g2.getFontMetrics(); 

      int textWidth = fm.stringWidth(textToDraw); 
      int textHeight = fm.getHeight(); 

      BufferedImage img = new BufferedImage(textWidth, textHeight, BufferedImage.TYPE_INT_ARGB); 
      Graphics2D ig = img.createGraphics(); 
      ig.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
      ig.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 
      ig.setColor(drawColor); 
      ig.drawString(textToDraw, 0, fm.getAscent()); 
      ig.dispose(); 

      int x = (getWidth() - textWidth)/2; 
      int y = (getHeight() - textHeight)/2; 

      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
      g2.setTransform(AffineTransform.getRotateInstance(Math.toRadians(angle), getWidth()/2, getHeight()/2)); 
      g2.drawImage(img, x, y, this); 
      g2.dispose(); 
     } 

    } 

} 
+0

그것은 확실히 ... 다음 이미지를 회전 (당신은 속성 내가 paint 방법에서 그것을 한 적이있는, 저와는 달리, 변경하는 경우에만 이미지를 만들어야을) 못생긴,하지만 그건 속임수를 했어 – Ben

+0

매혹적인 버그, 뒤쪽의 고통, 매혹적인 – MadProgrammer