2008-08-28 5 views
3

私はリストを持っています。リストには、多くのものを更新できるJProgressBarを含むいくつかのものがあります。アイテムのいずれかが更新されるたびにそのJProgressBar、リスト上のListDataListenerはそれを私はスクロールがI以来、ディスパッチスレッドで実行されていることを確認しようとしている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に委任した直後に機能を終了する必要があります。あなたのコードが書かれている方法では、ContentChangedが非EDTスレッドから呼び出された場合、両方のスレッドで更新が起こるようです。最初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); 
    } 
} 
関連する問題