代码之家  ›  专栏  ›  技术社区  ›  Unhandled Exception

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

  •  0
  • Unhandled Exception  · 技术社区  · 9 年前

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

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

    Graphics和Graphics2D都是抽象类。 另外,Graphics2D是Graphics的一个子类。 因此,从Graphics转换为Graphics2D(g2=(Graphics二维)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的转换有效(特别是因为它们是抽象对象),因此内存中的原始对象必须已经是Graphics二维并定义了抽象方法。那么,传递给paint()调用的Graphics对象引用的内存中的实际底层对象是什么?

    1 回复  |  直到 9 年前
        1
  •  2
  •   C. K. Young    9 年前

    在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);
        }
    }