2012-03-01 3 views
1

バックグラウンドスレッドでBufferedImageを作成および更新しています。画像は、次に示すように、パネルペイントメソッドをオーバーライドすることによってJPanelに描画されます。バックグラウンドスレッドからバッファリングされたイメージを更新する

@Override 
public void paint(Graphics g) { 
    g.drawImage(image, 0, 0, null); 
} 

バックグラウンドスレッドは、イメージを定期的に更新し、パネルinvalidateメソッドを呼び出します。

この方法で問題が発生しますか?スイングスレッドの読み込みとバックグラウンドスレッドが画像を更新しても問題はありませんか?

おかげ

ベン

+0

これは、画像を更新しているときに(AWTスレッド経由で)描画している場合は問題があります。スレッド同期。 – Adrian

+1

"Swingプログラムは' paint() 'をオーバーライドする代わりに' paintComponent() 'をオーバーライドする必要があります。" - [AWTとSwingのペイント:ペイントメソッド](http://java.sun.com/products/ jfc/tsc/articles/painting/index.html#callbacks)。 – trashgod

+1

1)trashgodに言及したことに加えて、 'drawImage'の最後の引数として渡される' null'パラメータは 'ImageObserver'です。 'JPanelはImageObserverを実装しているので、' g.drawImage(image、0、0、this); 'でなければなりません。 2)パネルを埋めるために画像を伸ばしたり、上に他のコンポーネントを追加したりしない限り、表示するには 'JLabel'を使います。 3)イメージを伸ばすが、コンポーネントをオーバーレイしない**場合は、 'JComponent'でレンダリングします。 –

答えて

1

共有データへのアクセスを同期する必要があります二つのスレッド。 SwingWorkerは、定期的にBufferedImageを公開する最も信頼性の高い方法です。 Doubleを使用しているhereの例があります。彼はEventQueuerepaint()によって与えられた(暗黙の)順序に依存する例hereを見るかもしれません。どちらの場合でも、制限要因は、再描画時間に対するタイマー周波数です。

+0

私がやったことは、バックグラウンドスレッドでイメージのコピーを作成することでした。 JPanelはバックグラウンドスレッドがコピーを渡して呼び出すコールバックインタフェースを実装しています。その後、JPanelは 'SwingUtilities.invokeLater'を使ってJPanelを変数に設定し、自己のrepaintを呼び出します。 – benshort

関連する問題