Java paintComponent中的g参数(图形g)

Java paintComponent中的g参数(图形g),java,swing,graphics,jpanel,paintcomponent,Java,Swing,Graphics,Jpanel,Paintcomponent,我是java初学者。我在一本书中遇到了方法paintComponent(),书中说系统在需要调用该方法时调用该方法 我的问题是g论点是什么 它是Graphics类的对象还是Graphics2D类的对象 它是如何通过系统的 在我们绘制组件后,它是否由面板和图纸组成 我无法想象这个过程 非常感谢图形参数是一个Graphics2D对象。在本例中,paint方法采用抽象图形类。无法实例化此类。Java将向它传递一个Graphics2D对象,当需要使用“g”时,需要将其转换为Graphics2D以确认它是

我是java初学者。我在一本书中遇到了方法
paintComponent()
,书中说系统在需要调用该方法时调用该方法

我的问题是g论点是什么

它是
Graphics
类的对象还是
Graphics2D
类的对象

它是如何通过系统的

在我们绘制组件后,它是否由面板和图纸组成

我无法想象这个过程


非常感谢

图形参数是一个Graphics2D对象。在本例中,paint方法采用抽象图形类。无法实例化此类。Java将向它传递一个Graphics2D对象,当需要使用“g”时,需要将其转换为Graphics2D以确认它是Graphics2D实例。然后,您可以将其用作Graphics2D对象,而不是实现抽象图形对象的实例

因此,虽然“g”是一个图形对象,但会为该方法传递一个Graphics2D对象,并且需要一个cast来使用它

本教程对其进行了很好的总结():

参数g是图形对象。实际上,引用的对象 by g是Graphics2D类的一个实例

因此,如果我们需要使用Graphics2D类中的方法,我们可以 直接在绘图组件(图形g)中输入g。然而,我们可以投下它 使用新的Graphics2D变量

我想我找到了传递实际Graphics2D对象的位置。在Component.java类中,第4356行似乎返回了SunGraphics2D对象,并将其传递给调用paintComponent的JPanel

public Graphics getDrawGraphics() {
    revalidate();
     Image backBuffer = getBackBuffer();
      if (backBuffer == null) {
          return getGraphics();
       }
       SunGraphics2D g = (SunGraphics2D)backBuffer.getGraphics();
       g.constrain(-insets.left, -insets.top,
                    backBuffer.getWidth(null) + insets.left,
                    backBuffer.getHeight(null) + insets.top);
       return g;
    }

我不确定这是否是Graphics2D对象制作的确切位置,但它肯定是将其传递给paintComponent方法的位置之一。

Graphic g
reference也可以接受
Graphic2D
类的实例,因为该类是
Graphic
的子类型。通过打印
g.getClass()
“我的问题是g参数是什么?”的结果,您可以找到传递了哪个类的实例。Java文档非常棒,请参阅。话虽如此,传递给Swing paint方法的
Graphics
实例通常可转换为
Graphics2D
。只是,这不能保证。@Andrew Thompson如何将对超类实例的引用转换为子类实例?我知道这是不可能的你什么意思?如果
class-Child扩展了Parent{..}
,那么使用code
void-somethod(Parent p){Child-ch=(Child)p}
,可以编译,因为可以将它与
Child
实例一起使用,比如
somethod(new-Child())。如果您传递的是
父类
实例,那么它可能不起作用,但随后您将得到您应该得到的运行时异常。@Pshemo ok谢谢。因此,当系统将Graphics2D类型的参数传递给方法时,可以执行强制转换