2008-08-28 6 views
3

많은 항목을 업데이트 할 수있는 JProgressBar을 비롯한 각 항목에 몇 가지 항목이있는 목록이 있습니다. 항목 중 하나가 업데이트 될 때마다 그 JProgressBar, 목록에있는 ListDataListener 그것을 내가 스크롤이 난 이후, 디스패치 스레드에서 수행되었는지 확인하기 위해 노력하고있어뷰포트 밖의 JScrollPane 페인팅 목록

/* 
* This makes the updating content item automatically scroll 
* into view if it is off the viewport. 
*/ 
public void contentsChanged(final ListDataEvent evt) { 
    if (!EventQueue.isDispatchThread()) { 
     /** 
      * Make sure the scrolling happens in the graphics "dispatch" thread. 
      */ 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       contentsChanged(evt); 
      } 
     }); 
    } 
    if (playbackInProgress) { 
     int index = evt.getIndex0(); 
     currentContentList.ensureIndexIsVisible(index); 
    } 
} 

주를 사용하여 가시 범위를 스크롤하려고 아마도 문제는 다시 칠하는 동안 스크롤되는 문제 일 것입니다. 그리고 아직 상황이 실제로 활발하다면 목록 항목 중 일부가 뷰포트 외부로 페인트되어 JScrollPane 외부의 항목을 덮어 쓰는 문제가 있습니다. 노출 이벤트를 강요하면 그 일을 다시 채울 수 있지만 성가시다.

클리핑 영역 외부에서 이러한 것들을 멈추려면주의해야 할 사항이 있습니까?

답변

3

명시 적으로 JList 및/또는 그 위에 그려진 구성 요소에 더블 버퍼링을 사용하도록 설정 했습니까? (with : setDoubleBuffered(boolean aFlag))

또 다른 생각은 이 EDT에 위임 한 직후에 기능을 종료해야한다는 것입니다. 코드가 작성된 방식으로, 비 EDT 스레드에서 ContentChanged이 호출되면 두 스레드에서 업데이트가 발생하는 것처럼 보입니다. 첫 번째 if에 로그인 (또는 경우에 중단 점을 설정 - 실행 가능한이 아니라 하지 - 그 문제인지 확인 도움이 될 것입니다

을 예 :

public void contentsChanged(final ListDataEvent evt) 
{ 
    if (!EventQueue.isDispatchThread()) 
    { 
     log.debug("Delegating contentsChanged(...) to EDT"); 

     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       contentsChanged(evt); 
      } 
     }); 
     // don't run ensureIndexIsVisible twice: 
     return; 
    } 

    if (playbackInProgress) 
    { 
     int index = evt.getIndex0(); 
     currentContentList.ensureIndexIsVisible(index); 
    } 
} 
.