gpt4 book ai didi

java - 如何在 Java 中成功扩展图形

转载 作者:搜寻专家 更新时间:2023-11-01 03:30:36 27 4
gpt4 key购买 nike

我正在尝试创建一个通用的图形导出工具,它通过实现图形接口(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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com