我遇到了这段代码。在我编程中遇到任何打嗝之前,我以为我减轻了这种混乱。我无法理解paint或actionPerformed方法是否首先在Board类中执行。我希望我的java评论正确陈述。
问题是,我在夏天采用了入门Java,并且只在课程结束时引入了图形。该类使用了ImageIcon,我们从未接触过drawImage方法和Image抽象类。我也完全不理解绘画方法。这段代码比我的Java图形讲座更复杂。基于Java API,paint方法源自JComponent类,它是JPanel的超类。
那么paint方法所涉及的这个参数图形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();
}
}
答案 0 :(得分:2)
使用Java绘图(基本上所有当前的窗口系统)遵循好莱坞原则:
你不打电话给我;我叫你。
即。你可以告诉系统某个区域需要重新绘制(repaint()
)。但是您必须等到系统调用您进行绘图。在Java中,系统将调用paint()
方法并向您传递Graphics
实例以用于绘图。
所以事件的顺序是:
actionPerformed()
paint()
Graphics
通常称为图形上下文。它是用于绘图的对象。根据系统和当前要求,绘图可能直接在屏幕上或后面复制到屏幕的屏幕外缓冲区。 Graphics
实例负责处理细节。
答案 1 :(得分:1)
如果我错了,有人可以纠正我。
是的,图形是一个抽象类。但是,继承Graphics的任何类的实例(例如Graphics2D)都可以作为图形传递。如果我没记错的话,这就是呼叫转播。 g由调用paint()的UI线程传递,因为该对象无效,或者必须更新。
图形对象是对用户显示的实际位图的引用。