다른 시스템에서 다르게 작동하는 Java AffineTransform

EricF

나는 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

어떻게 이럴 수있어?

Cull

이는 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Java 해시 코드는 다른 시스템에서 다르게 작동합니다

fread ()는 다른 엔디안 시스템에서 다르게 작동합니까?

Java 7과 Java 8에서 다르게 동작하는 getDeclaredMethods ()

Java 6 및 Java 7에서 다르게 작동하는 intern ()

다르게 동작하는 Java 스레드

Java Swing이 시스템마다 다르게 작동하는 이유는 무엇입니까?

다른 시간에 다르게 작동하는 Router.push()

다른 서버에서 다르게 작동하는 쿼리

Selenium Java 자동화는 일부 시스템에서는 빠르게 실행되고 일부 시스템에서는 느리게 실행됩니다.

다른 qt 버전에서 다르게 동작하는 QHash

다른 브라우저에서 다르게 작동하는 ExtJ

다른 페이지에서 다르게 작동하는 앵커

@InjectMocks는 Java 6 및 7에서 다르게 작동합니다.

Java 11과 Java 8에서 다르게 작동하는 드래그 앤 드롭

Ubuntu64 9.04 시스템의 Java 응용 프로그램에서 도메인 이름 확인이 작동하지 않습니다. 다른 모든 소프트웨어는 DNS를 올바르게 확인합니다.

java는 osx 및 linux에서 파일 시스템 파일 이름을 다르게 읽습니다.

Java 메일이 다른 운영 체제에서 다르게 작동합니까?

하나의 Java 코드가 2 개의 다른 PC에서 다르게 작동합니다.

Java에서 if (Boolean.TRUE) {...}와 if (true) {...}가 다르게 작동하는 이유

while 루프가 Java와 C에서 다르게 작동하는 이유

다른 jvm 또는 다른 시스템에서 Java에서 Math.random ()이 얼마나 무작위인지

한 Linux 시스템에서 다른 Linux 시스템으로 파일을 복사하는 Java 코드

한 Linux 시스템에서 다른 Linux 시스템으로 파일을 복사하는 Java 코드

동일한 JAVA 프로그램이 Windows 및 Linux와 같은 다른 플랫폼에서 다르게 작동하는 이유는 무엇입니까?

두 개의 다른 RHEL 서버에서 다르게 작동하는`cp -pr`

Lambda 표현식이 Kotlin 및 Java 클래스에서 다르게 작동하는 이유는 무엇입니까?

동일한 Regex는 Java와 Elasticsearch에서 다르게 작동합니다.

동일한 Regex는 Java와 Elasticsearch에서 다르게 작동합니다.

Java에서 AffineTransform과 좌표 기반 시스템을 사용하는 방법은 무엇입니까?

TOP 리스트

  1. 1

    C # 16 진수 값 0x12는 잘못된 문자입니다.

  2. 2

    Matlab의 반복 Sortino 비율

  3. 3

    librosa로 생성 된 스펙트로 그램을 다시 오디오로 변환 할 수 있습니까?

  4. 4

    PhpStorm 중단 점에서 변수 값을 볼 수 없습니다.

  5. 5

    종속 사용자 정의 Lightning 선택 목록 Level2 및 Level3을 설정한 다음 Lightning 구성 요소에서 Level2를 재설정하지만 Level2 캐시 데이터가 저장됨

  6. 6

    Watchdog 큐 이벤트를 사용하는 Python 병렬 스레드

  7. 7

    atob은 인코딩 된 base64 문자열을 디코딩하지 않습니다.

  8. 8

    dev 브랜치에 병합 할 때만 트리거하도록 bitbucket에서 AWS Codebuild로 웹훅을 설정하려면 어떻게해야합니까?

  9. 9

    2 개의 이미지를 단일 평면 이미지로 결합

  10. 10

    Assets의 BitmapFactory.decodeStream이 Android 7에서 null을 반환합니다.

  11. 11

    막대 그래프 위에 선이 표시되지 않음

  12. 12

    Python : 특정 범위를 초과하면 플롯의 선 색상을 변경할 수 있습니까?

  13. 13

    기능 선택을위한 Sklearn Chi2

  14. 14

    Ionic 2 로더가 적시에 표시되지 않음

  15. 15

    EventEmitter <string>의 컨텍스트 'this'가 Observable <string> 유형의 'this'메서드에 할당되지 않았습니다.

  16. 16

    매개 변수에서 쿼리 객체를 선언하는 방법은 무엇입니까?

  17. 17

    openCV python을 사용하여 텍스트 문서에서 워터 마크를 제거하는 방법은 무엇입니까?

  18. 18

    아이디어 Intellij : 종속성 org.json : json : 20180813을 찾을 수 없음, maven에서 org.json 라이브러리를 가져올 수 없음

  19. 19

    일반 메서드에서 클래스 속성에 액세스하는 방법-C #

  20. 20

    식별자는 ORA-06550 및 PLS-00201로 선언되어야합니다.

  21. 21

    함수 호출 사이에 데이터를 저장하는 파이썬적인 방법은 무엇입니까?

뜨겁다태그

보관