나는 AffineTransform
내가 그리는 텍스트를 회전 하는 데 사용 하기 시작했고 Graphics2D
때때로 잘 작동하고 다른 때는 Windows 7 PC에서 항상 예상대로 작동하지만 Windows 10 랩톱에서는 절대 작동하지 않는다는 것을 깨달았을 때 제대로 작동하지 않는 것으로 나타났습니다.
두 시스템 모두에서 Java 15.0.1을 사용합니다.
내 요점을 보여주는 작은 테스트 사례가 있습니다.
import javax.swing.*;
import java.awt.*;
import java.awt.geom.AffineTransform;
public class AffineTransformTest extends JPanel {
private static final int SIZE = 40;
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
int centerX = getWidth()/2;
int centerY = getHeight()/2;
g2.setColor(Color.BLACK);
g2.drawRect(centerX - SIZE/2, centerY - SIZE/2, SIZE, SIZE);
AffineTransform at = g2.getTransform();
at.setToRotation(Math.toRadians(45),centerX, centerY);
g2.setTransform(at);
g2.setColor(Color.RED);
g2.drawRect(centerX - SIZE/2, centerY - SIZE/2, SIZE, SIZE);
}
public static void main(String[] args) {
JFrame frame = new JFrame();
AffineTransformTest test = new AffineTransformTest();
frame.setContentPane(test);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,300);
frame.setVisible(true);
}
}
검은 색 사각형은 JPanel
. 빨간색 직사각형은 45 ° 회전 후 그려지며 검은 색 직사각형과 동일한 중심을 공유해야합니다 (첫 번째 그림 참조).
그러나 내 노트북은 두 번째 그림에 표시된 결과를 생성합니다.
예상 결과-Windows 7 | 잘못된 결과-Windows 10
어떻게 이럴 수있어?
이는 Javadoc에 명시된 paintComponent () 메소드의 계약을 위반하기 때문일 수 있습니다.
하위 클래스에서 이것을 재정의하는 경우 전달 된 Graphics를 영구적으로 변경해서는 안됩니다. 예를 들어 클립 사각형을 변경하거나 변형을 수정해서는 안됩니다. 이러한 작업을 수행해야하는 경우 전달 된 Graphics에서 새 Graphics를 만들고 조작하는 것이 더 쉬울 수 있습니다.
따라서 Windows 7과 Windows 10 기본 UI 구현 간의 미묘한 차이가 하나는 중단되고 다른 하나는 그렇지 않은 이유입니다.
이것이 실제로 원인인지 확인하려면 Graphics 객체의 복제본을 만들고 원본을 변경하지 않은 상태로 둘 선 Graphics2D g2 = (Graphics2D)g;
을 변경해보십시오 Graphics2D g2 = (Graphics2D)g.create();
.
정답을 명확히하기 위해 편집 : 이 문제는 at.setToRotation
검은 색 사각형을 그린 후 회전 된 빨간색 사각형을 그리기 전에 그래픽 컨텍스트에서 기본 배율 변환을 지우는 호출 로 인해 발생했습니다 . 권장되는 솔루션은 기존 크기 변환을 유지하는 객체에서 rotate(theta,x,y)
직접 메서드 형식 을 호출하는 것입니다 Graphics2D
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다