2009-02-03 47 views
4

我正在嘗試創建一個通用圖形導出工具,該工具通過實現圖形接口並截取並解釋對其各種方法的調用。但是,雖然我可以成功地爲單個組件執行此操作,但是當我在包含其他組件的組件上使用它時,我的Graphics類將被替換。奇怪的是,這隻發生在Windows和Linux上。在OSX上它工作正常。我該如何成功擴展Java中的圖形

任何人都可以建議我如何確保它是我的原始圖形類傳遞給所有子組件?

我有一個簡短的腳本,它演示了基本問題。當我使用MyGraphics實例顯式調用paint時,在JPanel中看不到MyGraphics - 只是sun.java2d.SunGraphics2D。

import java.awt.*; 
import java.awt.image.*; 
import java.text.AttributedCharacterIterator; 
import javax.swing.*; 

public class GraphicsTest { 

public static void main(String[] args) { 
    new GraphicsTest(); 
} 

public GraphicsTest() { 
    JFrame frame = new JFrame(); 
    frame.getContentPane().add(new MyPanel()); 
    frame.setSize(500,500); 
    frame.setVisible(true); 
    try { 
     Thread.sleep(2000); 
    } catch (InterruptedException e) {} 
    System.out.println("Using my graphics - expect to see 'MyGraphics' next"); 
    frame.paint(new MyGraphics()); 

} 

class MyPanel extends JPanel { 
    public void paint (Graphics g) { 
     super.paint(g); 
     System.out.println("Graphics is "+g); 

     g.fillRect(10, 10, 20, 20); 
    } 
} 

class MyGraphics extends Graphics { 

    public String toString() { 
     return "MyGraphics"; 
    } 

    public Graphics create() { 
     return this; 
    } 

    // I've left out the huge list of abstract methods from the original script 
    // since they're unchanged from the defaults and don't really matter here. 
} 

在我的Windows系統的輸出是:

 
Graphics is sun.java2d.SunGraphics2D[font=javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=plain,size=12],color=sun.swing.PrintColorUIResource[r=51,g=51,b=51]] 
Using my graphics - expect to see 'MyGraphics' next 
Graphics is sun.java2d.SunGraphics2D[font=javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=plain,size=12],color=sun.swing.PrintColorUIResource[r=51,g=51,b=51]] 

而OSX下,我得到我所期待的,那就是:

 
Graphics is sun.java2d.SunGraphics2D[font=apple.laf.CUIAquaFonts$DerivedUIResourceFont[family=LucidaGrande,name=LucidaGrande,style=plain,size=13],color=javax.swing.plaf.ColorUIResource[r=0,g=0,b=0]] 
Using my graphics - expect to see 'MyGraphics' next 
Graphics is MyGraphics 

所以我我能做些什麼來保證在所有情況下,我都會將「MyGraphics」傳遞給相應的子組件?

回答

1

我不確定,但我懷疑由於swing在Windows上(而不是OS X上的窗口管理器)被Java雙重緩衝,所以你不會畫到你的圖形,而是Graphics2D由屏幕外緩衝區提供,然後blt到您的圖形。

1

就是這樣!如果我在調用paint之前禁用組件的雙緩衝,然後重新啓用它,那麼一切都按我需要的方式工作。

RepaintManager.currentManager(frame).setDoubleBufferingEnabled(false); 
frame.paint(new MyGraphics()); 
RepaintManager.currentManager(frame).setDoubleBufferingEnabled(true); 

謝謝。

+0

請將此信息添加到您的問題!或者給Pete的回答添加評論。 – guerda 2009-02-03 11:33:39