2011-12-06 24 views
3

ピクチャをロードしたり、GUI形式で表示したり、変換を適用したり、変形した画像を表示することができるシンプルなJavaアプリケーションを作成する必要があります。 repaintメソッドは、あまりにも頻繁に呼び出されるので 、私のソリューションが正常に動作しているが、UIが少し点滅している(例えばJSliderの持つイメージをスケーリングユーザーがいる場合)Java Swing - キャンバスのグラフィックがちらつく

私のコードは次のようになります。

public class ImageCanvas extends Canvas 
{ 
    private BufferedImage image; 
    // ... 

    @Override 
    public void paint(Graphics g) 
    { 
     Graphics2D g2d = (Graphics2D) g; 
     if(image != null) 
     { 
      // I draw out the image... 
     } 
    } 

    public void setImage(BufferedImage image) 
    { 
     this.image = image; 
     this.repaint(); 
    } 

    public void setRotation(double rotation) 
    { 
     this.rotation = rotation; 
     this.repaint(); 
    } 

    public void setScale(double scaleX, double scaleY) 
    { 
     //set the scaling field, then repaint .... 
    }  

    // and so on... 
} 

もちろん、メインUIにImageCanvasコントロールがあります。キャンバス領域を再描画するパブリックメソッド(上記の "setRotation"メソッドを参照してください)を呼び出します。私はそれが簡単な質問だと知っていますが、キャンバスにDoubleBufferedプロパティが見つからない...

助けてください。

答えて

7

スイング(つまり、JComponent派生)クラス用にダブルバッファリングが組み込まれています。

ビルトインのダブルバッファリングを使用する場合は、CanvasではなくJPanelを拡張し、paintComponentではなく、paintを上書きする必要があります。

+0

JCanvasはありません... JPanelを使用する必要がありますか? – asdfghjkl

+0

@asdfghjkl:はい、JPanelで、 'paint'ではなく' paintComponent'をオーバーライドします。上記の回答が修正のために編集されました。 –

+0

これはJPanelで動作します。私はこれがSwingの "ベストプラクティス"になるか、それともハックだとは分かりませんが、感謝しています。 – asdfghjkl

-1

通常、スクリプトの先頭に空の変数を設定し、その値を変更して再描画が更新されるのを待っているため、これらのアプリケーションでグラフィックスが遅れることがあります。その方法でイメージを回転できるように、

setRotation(double rotation); 

を変更してみてください。

グラフィックを扱う際に私はよく見かけることがあります。

+0

は、2回以上読んだ後でさえ私には意味をなさない:何も「通常遅れる」、「空の変数」も「スクリプト」もない。しかし、何が空であるかは、コードスニペットです。 – kleopatra

+0

あなたがコード全体を投稿していないのであれば、すみません。あなたは完全な助けを得られないだろうと思います。 – Matt

1

JPanelを使用することができます。 JPanel.paintメソッドをオーバーライドしていないことを確認してください。代わりにJPanel.paintComponentをオーバーライドしてください。 詳しくはlinkをご覧ください。

関連する問題