【发布时间】:2012-12-30 19:02:57
【问题描述】:
我遇到了这段代码。我想在我在编程过程中遇到任何问题之前,我可以缓解这种困惑。我无法理解绘画或 actionPerformed 方法是否首先在 Board 类中执行。我希望我的 java cmets 是正确的。
问题是,我在夏天学习了 Java 入门,而图形只是在课程结束时才介绍。该类使用了 ImageIcon,我们从未接触过 drawImage 方法和 Image 抽象类。我也完全不懂绘画方法。这段代码比我参加的 Java 图形讲座更复杂。基于 Java API,paint 方法源自 JPanel 的超类 JComponent 类。
那么,paint 方法所接受的这个参数 Graphics g 到底是什么,我应该怎么想呢? paint 方法如何知道要绘制图形类的哪个对象。我查看了 Java API,它说 Graphics 是一个抽象类。如果 g 的数据类型是抽象的,它怎么可能是一个对象?我说 g 是一个对象,因为代码在对象 g 上调用 drawImage 方法。
顺便说一句,repaint 方法是否意味着擦除 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();
}
}
【问题讨论】:
-
我认为您所问的大部分问题以及您尚未(但将要)问的重要问题都可以在这里得到解答:Painting in AWT and Swing
-
请注意,您应该覆盖
paintComponent(...)而不是paint(...)。请注意,repaint()仅向绘制管理器建议应该绘制 GUI,并且并不总是在调用paint(...) 之后调用绘制(...),尤其是在绘制调用被“堆叠”时。并且 repaint() 不会删除任何内容。这是执行任何擦除操作的 super paint(...) 或paintComponent(...)调用。 -
前者和后者有什么区别? paintComponent 表示它将调用paint 方法。为什么会有这个额外的过程?
-
请阅读链接。您会看到paintComponent 不会调用paint!更像是反之亦然。另请阅读有关双缓冲的内容。
-
感谢您的链接。我会认真阅读的!
标签: java class action paint abstract