2011-12-06 135 views
3

我必須編寫一個簡單的Java應用程序,它可以加載圖片,以GUI形式顯示它,允許用戶應用一些轉換,並顯示轉換後的圖片。 我的解決辦法工作正常,但用戶界面閃爍了一下,因爲調用過於頻繁重繪方法(例如,當縮放用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

雙緩衝內置Swing(即JComponent派生)類。

如果要內置雙緩衝,則應擴展JPanel而不是Canvas,並覆蓋paintComponent而不是paint

+0

沒有JCanvas ...我應該使用JPanel嗎? – asdfghjkl

+0

@asdfghjkl:是的,JPanel並重載'paintComponent',而不是'paint'。上面的答案被編輯修正。 –

+0

好的,它適用於JPanel。我不知道,如果這可能是Swing的「最佳實踐」,或者它是黑客,但謝謝。 – asdfghjkl

-1

通常,在這些應用程序中,圖形滯後可能是由於在腳本頂部設置了一個空變量,然後更改其值,然後等待重繪來更新它。您可以嘗試更改:

setRotation(double rotation); 

以便它旋轉該方法中的圖像。

只是我碰巧在處理圖形時看到的一般事物。

+0

對我來說是沒有意義的,即使讀了不止一次:沒有「通常滯後」,既沒有「空變量」,也沒有「腳本」。但是,什麼是空的是代碼片段。 – kleopatra

+0

如果您沒有發佈整個代碼,那麼我很抱歉。猜猜你不會得到完整的幫助。 – Matt

1

如果你可以使用JPanel比去它。請確保您不是覆蓋JPanel.paint方法,而是覆蓋JPanel.paintComponent。 有關詳細信息,請參閱此link