你如何使用图形'g'?

问题描述 投票:0回答:2

我是一个初学者的课程,正在教java,在我们的阅读中,他们举了一个关于使用图形来绘制项目的例子。所以,我将代码发布到我的IDE中并试用了它。

他们发布的代码应该创造一个外星人的面孔

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import javax.swing.JComponent;

/*
   A component that draws an alien face
*/
public class FaceComponent extends JComponent
{  
   public void paintComponent(Graphics g)
   {  
      // Recover Graphics2D 
      Graphics2D g2 = (Graphics2D) g;

      // Draw the head
      Ellipse2D.Double head = new Ellipse2D.Double(5, 10, 100, 150);
      g2.draw(head);

      // Draw the eyes
      g2.setColor(Color.GREEN);
      Rectangle eye = new Rectangle(25, 70, 15, 15);
      g2.fill(eye);
      eye.translate(50, 0);
      g2.fill(eye);

      // Draw the mouth
      Line2D.Double mouth = new Line2D.Double(30, 110, 80, 110);
      g2.setColor(Color.RED);
      g2.draw(mouth);

      // Draw the greeting
      g2.setColor(Color.BLUE);
      g2.drawString("Hello, World!", 5, 175);
   }
}

但是我不确定你是如何创建调用该函数的Graphics的。我原以为你会用

Graphics g = new Graphics();

就像你如何称呼一个新类,但结果证明这是一个错误。我试着查看文档,但它似乎掩盖了你用于'g'的内容。

请帮我理解。

或者这是一个我需要从另一个类调用的类,因为我正在扩展它?

java swing awt
2个回答
0
投票

不要使用新运算符创建Graphics g。它通过public void paintComponent(Graphics g)方法传递。

请注意,Java实际上通过此接口传递Graphics2D对象(这使得转换成为可能)但由于遗留原因,通过使Graphics对象继承自Graphics2D来保持Graphics接口。

你不创建一个新的Graphics对象的原因是因为传递的Graphics对象是其他小部件使用的对象,以及一般的AWT / Swing接口。

就“使用”而言,它是标准的Java对象。像Java对象一样使用它,通过调用它的方法。

g.setColor(...);

等。


1
投票

paintComponent(Graphics g)是一个从JComponent继承的方法(注意paintComponent应该有@Override anotation),它是GUI绘制系统的一部分。它是从Java Swing Framework调用的,要求Component在屏幕上绘制自己。过去该方法的对象已经实例化并且对于使用有效。

您必须使用类似JFrame / JPanel将组件添加到屏幕,并使其可见以使其正常工作。

此外,由于您没有实现可测量的屏幕,您需要在布局内添加一些空间以查看结果(在插入之后,在frame.pack()之前的setMinimumSize())。

© www.soinside.com 2019 - 2024. All rights reserved.