传递给paint()调用的顶级组件是什么?

时间:2016-06-05 00:46:49

标签: java graphics paint graphics2d

查看与Java和图形相关的一些教程,并不断看到以下内容:

public void paint (Graphics g) 
{
     Graphics2D g2;
     g2 = (Graphics2D) g;
       :
       :
}

Graphics和Graphics2D都是抽象类。 另外,Graphics2D是Graphics的子类。 结果,从Graphics到Graphics2D(g2 =(Graphics2D)g;)的转换不应该工作,对吗?

public class Object1 {
    int obj1Var1;
    public void obj1_Method1()
    {
        System.out.println("Inside Object1:Method1");
    }
}

public class Object2 extends Object1{
    int obj2var1;
    public void obj2_Method1()
    {
        System.out.println("Inside Object2:Method1");
    }
}

使用上面的内容,它与Graphics / Graphics2D场景并行显示,它使用以下内容失败。

Object1 obj = new Object1();
Object2 obj2 = (Object2)obj;   <----This fails as expected. 

由于从Graphics到Graphics2D的转换工作(特别是因为它们是抽象对象),因此内存中的原始对象必须已经是Graphics2D并定义了抽象方法。那么,哪个是内存中的实际底层对象被Graphics对象传递给paint()调用?

1 个答案:

答案 0 :(得分:2)

在Oracle JDK中,该类称为sun.java2d.SunGraphics2D。您可以运行此程序以查看您的Java版本中的内容:

import java.awt.Graphics;
import javax.swing.JFrame;

public class SwingTest {
    private static class Frame extends JFrame {
        @Override
        public void paint(Graphics g) {
            super.paint(g);
            System.out.println(g.getClass().getName());
        }
    }

    public static void main(String[] args) {
        Frame frame = new Frame();
        frame.setVisible(true);
    }
}