문제

스윙 애플리케이션의 일부 사용자는 디스플레이에 이상한 인공물이 나타났습니다. 이것은 구성 요소의 범위에서 1 ~ 2 초 동안 제대로 다시 페인트하지 않으며, 응용 프로그램의 전체 부분까지는 창의 영역 위의 타일 벽지처럼 다시 칠해집니다.

이 앱은 5 년 정도 동안 숙련 된 Java Guys 사이의 모든 수준의 개발자들이 대학에서 대학 밖에서 젊은 챕터에 이르기까지 작업을 수행했으며, 예상대로 AWT 코드 중 일부는 완전히 엉망입니다. 나는 이제 앞으로 몇 달 정도 가능한 한 많은 악을 바로 잡으려고 노력하는 일에 직면하고 있습니다.

이 중 일부는 처리하기 쉽습니다. 이벤트 디스패치 스레드에서만 구성 요소를 다루고, IO 비동기 적으로, 일종의 일을하고, 나는 나머지 팀에게 메시지를 전달하기를 바랍니다.

내가 알고 싶은 것은 특히 PaintComponent () 컨텍스트에서 그래픽 컨텍스트를 다루는 가장 좋은 방법입니다. 나는 많은 것을 본다 ...

public void paintComponent( Graphics g ) {
    super.paintComponent( g );
    Graphics2D gfx = (Graphics2D)g;
    // ...Whole lotta drawing code...
}

이것을하는 것이 더 나은 연습입니까?

public void paintComponent( Graphics g ) {
    super.paintComponent( g );
    Graphics2D gfx = (Graphics2D)g.create();
    // ...Whole lotta drawing code...
    gfx.dispose();
}

G 매개 변수가 다른 페인트에서 재사용되면 좋은 상태로 복원 할 필요가 없으며, 애호가 변형을 취소하지 않습니까?

도움이 되었습니까?

해결책

더러운 부유 한 고객에 따르면, 당신은 Graphics 물체가 당신에게 전달되었습니다 (API, IMO로 짜증이 듭니다).

그것을 처리하는 올바른 방법은 약간 더 장점입니다.

public void paintComponent(Graphics g1) {
    super.paintComponent(g1);
    final Graphics2D g = (Graphics2D)g1.create();
    try {
         // ...Whole lotta drawing code...
    } finally {
         g.dispose();
    }
}

IIRC, SUN 구현에서 "하위 그래픽"객체를 처분하지 않더라도 중요하지 않습니다. (저를 인용하지 마십시오.)

그 댓글을 다른 객체에 비트를 위임하고 싶을 수도 있습니다.

다른 팁

나는 이것이 JDK-1.6.12에서 고정되었다고 들었지만 시도하지 않았다고 들었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top