2009-02-03 5 views
4

그래픽 인터페이스를 구현하여 작동하는 일반 그래픽 내보내기 도구를 만들고 다양한 방법에 대한 호출을 인터셉트하고 해석합니다. 그러나 하나의 구성 요소에 대해이 작업을 성공적으로 수행 할 수 있지만 다른 구성 요소가 포함 된 구성 요소에서 사용할 경우 Graphics 클래스가 교체됩니다. 이상하게도 이것은 Windows와 Linux에서만 발생합니다. OSX에서 잘 작동합니다.어떻게 성공적으로 그래픽을 Java로 확장 할 수 있습니까?

누구나 내가 모든 하위 구성 요소로 전달되는 내 원래 Graphics 클래스인지 어떻게 확인할 수 있습니까?

근본적인 문제를 보여주는 짧은 스크립트가 있습니다. 명시 적으로 MyGraphics의 인스턴스를 사용하여 페인트를 호출 할 때 JPanel에 MyGraphics가 표시되지 않습니다 (단지 sun.java2d.SunGraphics2D). 내 Windows 시스템에서

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. 
} 

출력은 다음과 같습니다

 
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

필자는 잘 모르지만, OS X의 윈도우 관리자 대신 스윙이 자바에서 이중 버퍼링을한다고 가정하면 그래픽에 그리지 않고 Graphics2D는 오프 스크린 버퍼에 의해 제공되고, 그런 다음 그래픽에 blt됩니다.

1

그게 전부 야! 페인트를 호출하기 전에 구성 요소에서 이중 버퍼링을 사용하지 않도록 설정했다가 나중에 다시 활성화하면 모든 것이 필요한대로 작동합니다.

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

감사합니다.

+0

이 정보를 귀하의 질문에 추가하십시오! 또는 피트의 대답에 댓글을 달아주세요. – guerda

관련 문제