0

我遇到了这段代码。我想在我在编程过程中遇到任何问题之前,我可以缓解这种困惑。我无法理解绘画或 actionPerformed 方法是否首先在 Board 类中执行。我希望我的 java 评论是正确的。

问题是,我在夏天学习了 Java 入门,而图形是在课程结束时才介绍的。该类使用了 ImageIcon,我们从未接触过 drawImage 方法和 Image 抽象类。我也完全不懂绘画方法。这段代码比我参加的 Java 图形讲座更复杂。基于 Java API,paint 方法源自 JPanel 的超类 JComponent 类。

那么paint方法所采用的这个参数Graphics g是什么,我应该如何考虑呢?paint 方法如何知道要绘制图形类的哪个对象。我查看了 Java API,它说 Graphics 是一个抽象类。如果 g 的数据类型是抽象的,它怎么可能是一个对象?我说 g 是一个对象,因为代码正在调用对象 g 的 drawImage 方法。

附带说明一下,重绘方法是否意味着擦除 JPanel 中的内容并像渲染一样重绘整个组件?

public class Board extends JPanel implements ActionListener{

private Image apple;
private int apple_x;
private int apple_y;

// over-riding the paint method from the JComponent Class
public void paint(Graphics g){
                // recursively call the paint method
                super.paint(g);

                g.drawImage(apple, apple_x, apple_y, this); 
    }

 // does this method gets called first or the top one?
 public void actionPerformed(ActionEvent e) {



        repaint();
    }

}
4

2 回答 2

2

用 Java 绘图(以及基本上所有当前的窗口系统)遵循好莱坞原则:

你不给我打电话;我打电话给你。

即,您可以告诉系统某个区域需要重新绘制 ( repaint())。但是您必须等到系统调用您进行绘图。在 Java 中,系统将调用该paint()方法并传递给您一个Graphics用于绘图的实例。

所以事件的顺序是:

  1. actionPerformed()
  2. paint()

Graphics通常称为图形上下文。它是用于绘图的对象。根据系统和当前要求,绘图可能会直接出现在屏幕上,也可能会进入屏幕外缓冲区,然后再复制到屏幕上。该Graphics实例负责处理细节。

于 2012-12-30T19:10:25.653 回答
1

如果我错了,有人可以纠正我。

是的,图形是一个抽象类。但是任何继承 Graphics 的类(如 Graphics2D)的实例都可以作为图形传递。如果我没记错的话,这是调用向上转换。g 由调用paint() 的UI 线程传递,因为对象已失效或必须更新。

图形对象是对显示给用户的实际位图的引用。

于 2012-12-30T19:10:17.950 回答