2016-12-18 4 views
0

これは、複数のタブを持つアプリケーションの断片がオフハングJTabbedPanelある: - :だから毎JButtonプレスだけでJPanelをペイントする方法は?

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D) g; 
    g2d.drawImage(device.getVisualisation(), 0, 0, null); 
} 

-

screen grab

Iは方法以下の標準のコードの画像を生成していますアプリケーションGUIに何か起きると、paintComponentメソッドが呼び出され、画像が表示されます。それは正常です。

このペイントイベントは、タブのフォーカスが変更された場合や、マウスが期待通りにタブを通過した場合にも発生します。問題は、グラフィックの生成に時間がかかるため、数秒かかることです。この遅れは避けられず、私はそれを受け入れます。あなたはGUIシステムがそれをしなければならないので、多くのペイントイベントを取得します。通常これは問題ありませんが、処理の遅れに伴い、guiは10秒間に数回停止/点滅/更新を行います。

私はこれをGUIのどこかの "REFRESH" JButtonから手動でrepaint()を呼び出すだけで済むと思っていました。しかし、あなたがタブを強くすると、私は自動塗り替えをオフにすることはできません。 のみボタンを押してコンポーネントをペイントしますが、自動的にはペイントしませんか?

答えて

2

ここでは、高価なプロセスが何であるかをまず最初に考えてやります。それは絵画ではなく、絵画によって表示される特別なイメージの計算と作成です。これを念頭に置いて、絵をオフにするのではなく、クルージュだけを含む画像を保存し、高価なdevice.getVisualisation()メソッドで再作成するときは注意深く制御します。

このメソッドが本当に長時間実行されている場合、CPUやコードを保持する必要のないpaintComponentでは呼び出されません。実際、メソッドはSwingから呼び出される必要がありますイベントスレッド、代わりにバックグラウンドスレッド内に存在します。次に、バックグラウンドスレッドの処理が完了したら、同じBufferedImageを更新してrepaint()と呼び出し、新しいイメージを表示します。例えば

private Image image = null; // holds our image 

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D) g; 
    if (image != null) { 
     // this will hardly take any time at all to run 
     g2d.drawImage(image, 0, 0, this); 
    } 
} 

public void myDrawImage() { 

    // create a SwingWorker for background threading work 
    new SwingWorker<Image, Void>() { 

     @Override 
     protected Image doInBackground() throws Exception { 

      // run this long-running code within this background thread 
      return device.getVisualisation(); 
     }; 

     @Override 
     protected void done() { 
      try { 
       // when the thread is done, get the new image, 
       // put it into our image field, and repaint the component 
       image = get(); 
       repaint(); 
      } catch (InterruptedException | ExecutionException e) { 
       // TODO handle any exceptions that occur with drawing 
      } 
     }; 
    }.execute(); 
} 

今描かれた画像のみとなりました長時間実行コードの呼び出しは、あなたの完全な制御下にあるように、あなたのプログラムは、具体的には、myDrawImage()メソッドを呼び出した場合に変更されます。

+0

はい、長時間実行されているプロセスです。カスタムハードウェアデバイスからデータをゆっくりと引き出しています。これが私の目の前にあるので、これは明らかに進む方法です。 –

+0

myDrawImage/SwingWorkerコードはどこにありますか?それは私の "リフレッシュ" jButtonの中に入っていますか?それはjTabbedPanelコンポーネントの一部ではありませんか? –

+0

@PaulUszak:必要な場所に移動します。 –

関連する問題