public void paint(Graphics g){
Graphics2D g2 = (Graphics2D)g; //
double r = 100; //the radius of the circle
//draw the circle
Ellipse2D.Double circle = new Ellipse2D.Double(0, 0, 2 * r, 2 * r);
g2.draw(circle);
这是我程序中一个类的一部分,我的问题在于
Graphics2D g2 = (Graphics2D)g;
为什么你必须在(Graphics2D)之后加上"g",以及括号中的"Graphics2D"到底是什么意思,我是从一本书中学到的,而这些都没有完全解释过。
您正在将Graphics2D
转换为Graphics
上下文g
。有关强制转换的更多信息,请参阅"转换"部分的"继承"。
这最终的作用是分配你使用可用的Graphics2D
方法和传递给paintComponent
方法的Graphics
上下文。除了选角之外,您只能使用Graphics
类的方法
Graphics2D
是 Graphics
的一个子类,因此通过使用Graphics2D
您可以获得所有Graphics
方法,同时利用Graphics2D
类中的方法。
旁注
-
你不应该被覆盖
paint
.另外,如果你是,你不应该像JApplet
这样的顶级容器上绘画。 -
而是在
JPanel
或JComponent
上绘画并覆盖paintComponent
而不是paint
并调用super.paintComponent
。然后只需将JPanel
添加到父容器即可。public DrawPanel extends JPanel { @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; } }
在自定义绘画和图形2D中查看更多信息
是的,您必须包含g
。
当您输入绘制方法时,您有一个类型为 Graphics
的对象g
。
然后,您将Graphics
对象进行类型转换,g
为一种Graphics2D
类型,该类型是扩展Graphics
的类型。
您必须包含g
,以便进行类型转换。如果您没有在此处包含对象,则会收到编译错误,因为该语句不完整。
g
对Graphics2D
对象进行类型转换的原因是,您告诉编译器"此图形对象实际上是一个 Graphics2D 对象",这样您就可以执行Graphics2D
对象具有而Graphics
对象没有的功能。
这个 stackoverflow 答案很好地解释了 Java 中的转换变量,如果你对此有更多疑问。这个堆栈溢出答案解释了为什么从Graphics
转换为Graphics2D
是安全的