作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试创建一个通用的图形导出工具,它通过实现图形接口(interface)并拦截和解释对其各种方法的调用来工作。但是,尽管我可以为单个组件成功执行此操作,但当我在包含其他组件的组件上使用它时,我的 Graphics 类将被替换。奇怪的是,这只发生在 Windows 和 Linux 上。在 OSX 上运行良好。
谁能建议我如何确保传递给所有子组件的是我的原始 Graphics 类?
我有一个演示基本问题的简短脚本。当我使用 MyGraphics 的实例显式调用绘画时,我在 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' nextGraphics 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”传递给适当的子组件?
最佳答案
我不确定,但我怀疑由于 swing 在 Windows 上由 Java 双缓冲(而不是由 OS X 上的窗口管理器),您不会绘制到图形,而是绘制到 Graphics2D由屏幕外缓冲区提供,然后 blt 到您的图形。
关于java - 如何在 Java 中成功扩展图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/506589/
我是一名优秀的程序员,十分优秀!