Java paintComponent中的g参数(图形g)
我是java初学者。我在一本书中遇到了方法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以确认它是
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{..}
,那么使用codevoid-somethod(Parent p){Child-ch=(Child)p}
,可以编译,因为可以将它与Child
实例一起使用,比如somethod(new-Child())代码>。如果您传递的是父类
实例,那么它可能不起作用,但随后您将得到您应该得到的运行时异常。@Pshemo ok谢谢。因此,当系统将Graphics2D类型的参数传递给方法时,可以执行强制转换