2013-01-28 1 views
6

을 시퀀싱 :자바 회전 텍스트가 반전 한 문자는 내가이 일을 오전 <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); 
} 

의 문자가 올바르게 회전하지만, 두 번째는 첫 번째 아래의 예상 위치에 있지 (그것 회전 된 공간에서) 왼쪽에서 왼쪽으로, 세 번째는 왼쪽에서 왼쪽으로 이동합니다. 회전 각도를 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 데모를 실행하고 변환 탭을 보는 경우 비슷한 문제가 발생합니까? (Java2D는 http://www.oracle.com/technetwork/java/javase/downloads/에서 다운로드 할 수있는 별도로 다운로드 할 수있는 JDK "데모 및 샘플"패키지의 demo/jfc/Java2D에 있습니다.) – VGR

답변

0

내가 지금 볼 수있는 것에서 작동 할 수있는 두 가지가 있습니다.

먼저 문자열을 문자 배열로 분할 한 다음 회전이 1 행 1 행 이동하여 글꼴 크기를 늘리면 (굵게 표시 될 경우 +1 또는 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

그래픽을 회전해도 렌더링되지 않은 것은 변경되지 않기 때문입니다. String을 회전시키기 전에 (어느 쪽을 볼 수 있어야하는지) String을 회전하면 읽을 수 없습니다. –

1

우리는 같은 일을보고있는 것이다. 우리는 JRE 6 및 7 버전의 대부분에 걸친 Windows에서 훌륭하게 작동하는 코드를 보유하고 있습니다. 같은 코드가 오늘 회전 된 문자 문제를 나타냈다. JRE 버전의 문제는 OS X에서 1.6.0_37입니다. 이전에 OS X에서 작동했을 수도 있고 그렇지 않을 수도 있습니다. 사용자의 99.9 %는 Windows에 있습니다.

한 가지 해결 방법은 텍스트를 BufferedImage로 렌더링 한 다음 이미지를 회전하는 것입니다. 그것은 20-30도 정도의 텍스트를 회전시키기 위해 더 나은 결과를 시각적으로 얻는 데 사용한 방법입니다.

2

나는 그것이 제대로 작동하게됩니다 FontRenderContext를 true로 앤티 앨리어싱을 설정 몇 가지 이유를 들어이 문제에 대한 이상한 솔루션 (즉 버그의 oddness 일치)

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