2010-03-03 76 views
1

我有一個嵌入在網頁中的Java JApplet。 JApplet窗口包含擴展JPanel的類的單個實例 - 與JApplet的大小相同。 當用戶單擊面板中的按鈕時,小應用程序可以產生彈出窗口(JFrames)。Java小應用程序閃爍焦點丟失和焦點已着色

每當我點擊一個按鈕彈出一個窗口,我的小程序會重新繪製時閃爍。當我再次點擊它或者它有焦點時,它也會做同樣的事情,我點擊不同的窗口 - 我的結論是:重繪是強制focusLost()和focusGained()事件。

我實現雙緩衝在面板的paint()方法是這樣的:

@Override 
public void paint(Graphics g) 
{ 
    if(resized) 
    { 
     offscreen = createImage(getWidth(),getHeight()); 
     resized = false; 
    } 

    Graphics offscreenG = offscreen.getGraphics(); 

    /// DRAW HERE: 

    // paint the main window contents: 
    view.paint(offscreenG); 
    // paint the child components of our panel. 
    super.paint(offscreenG); 

    /// FRAW FINISHED 

    g.drawImage(offscreen,0,0,this); 
    offscreenG.dispose(); 
} 

視圖對象不是一個Swing組件,但只是一類,它知道熱繪製的一切到一個圖形對象。

JApplet的paint()方法未被覆蓋。

我可能會重寫我的JApplet的focusGained/focusLost方法以防止重新繪製 - 但我寧願聽到更好的解決方案。

回答

1

沒有必要實現雙緩衝,這是由Swing自動完成的。您可以像構建應用程序一樣構建一個小程序。您將組件添加到JApplet的內容窗格。

如果您必須自定義繪畫,那麼您將覆蓋JPanel的paintComponent()方法並將該面板添加到小程序。

請參閱Custom Painting的Swing教程中的示例。

+0

謝謝 - 非常有幫助! – Warlax