2009-09-11 63 views
1

那麼我是一個初級java程序員,在上週我一直面臨以下問題:我有一個圖像和一個面板。圖像和麪板都在ScrollPane中,並且它們都需要同時移動。當我嘗試將它們一起移動時,我會產生閃爍的效果。單獨移動它們中的每一個,都可以正常工作。我讀過關於雙緩衝的內容,並決定實施它。我的問題是,我的圖像非常大,因此每次從頭開始繪製它會導致我的應用程序卡住。所以相反,我一直在考慮以下解決方案:Java - 圖形圖像

在我的繪畫功能中,我會推進大圖像的滾動條(正常工作),從我現在更新的圖形內容中繪製新圖像並繪製在它上面我的小組的內容。

儘管我在網上查找它,但我找不到解釋如何去做。所以簡短一點,我該如何使用當前的圖形對象從中繪製圖像?

+1

爲什麼不只是更新您的原始文章? - http://stackoverflow.com/questions/1392664/scroll-bar-problems-in-java-layered-panes/1393237#1393237 – Nate

回答

0

我想你在你的代碼中的某處做了一個覆蓋。

你有雙緩衝框架:

frame.setVisible(true); 
frame.createBufferStrategy(2); // Two is the number of buffers 
// Here is the order important: first set visible, then createStrategy 

那麼你的油漆方法在你的框架:(不要覆蓋方法)

public void updateGraphics() 
{ 
    BufferStrategy bs = getBufferStrategy(); 
    Graphics g = bs.getDrawGraphics(); 
    paint(g); 
    g.dispose(); 
    bs.show(); 
    Toolkit.getDefaultToolkit().sync(); 
    update(g); 
} 

這種方法,你可以在一個線程中使用:

new Thread("PainterThread") 
{ 
    public void run() 
    { 
      while (true) 
      { 
       try 
       { 
        updateGraphics(); 
        Thread.sleep(10); 
       } catch (Exception e) {} 
      } 
    } 
}.start(); 
0

據我所知,你不必手工實現雙緩衝。據我記得這裏是一個屬性(例如setDoubleBuffered(true))來激活雙緩衝。

與問候

+0

我該如何設置它? – vondip

+0

任何包含閃爍組件的組件。例如,滾動窗格或包含它的框架。 – Nat

+0

默認情況下啓用doubleBuffering - 調用此函數將不起任何作用。 – Nate

0

你可以把它擴展一些JComponent的(像的JPanel)面板,並覆蓋其paint方法。這樣的事情:

class MyPanel extends JPanel { 


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

    ... 
} 
+0

好吧,我這樣做,但既然我有jpanel和滾動條中的大圖像,當我嘗試將它們的滾動條移動到一起時,我得到了閃爍。我怎樣才能避免這種情況? – vondip

+0

我很確定,如果你在其他地方構造圖像(例如,BufferedImage myImage)_before_調用g.drawImage,它不會閃爍。我懷疑你現在可能正在繪製方法中構建你的圖像,可能會連續調用Graphics對象的不同方法;它肯定會閃爍。 –