Я пытаюсь создать универсальный инструмент экспорта графики, который работает за счет реализации графического интерфейса, перехватывает и интерпретирует вызовы его различных методов. Однако, хотя я могу сделать это успешно для одного компонента, мой класс Graphics заменяется, когда я использую его для компонента, который содержит другие компоненты. Странно, но это происходит только в Windows и Linux. На OSX работает нормально.
Кто-нибудь может подсказать, как я могу убедиться, что это мой оригинальный класс Graphics, который передается всем подкомпонентам?
У меня есть короткий сценарий, который демонстрирует фундаментальную проблему. Когда я явно вызываю рисование с использованием экземпляра MyGraphics, я не вижу MyGraphics в JPanel - просто 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» соответствующим подкомпонентам?