Java图形绘制方法执行流
我遇到了这个密码。在编程过程中遇到任何问题之前,我想我可以缓解这种困惑。我很难理解绘画或actionPerformed方法是在Board类中首先执行的。我希望我的java评论是正确的 问题是,我在夏天学习了Java入门课程,而图形只是在课程快结束时才开始学习的。该类使用ImageIcon,我们从未接触过drawImage方法和Image抽象类。我也一点也不懂画法。这段代码比我上过的Java图形课要复杂得多。基于javaapi,paint方法起源于JComponent类,JComponent类是JPanel的超类 那么,画图方法所采用的参数g是什么,我应该如何考虑?paint方法如何知道要绘制图形类的哪个对象。我看了JavaAPI,它说Graphics是一个抽象类。如果g的数据类型是抽象的,它怎么可能是一个对象呢?我之所以说g是一个对象,是因为代码正在调用对象g上的drawImage方法 另一方面,repaint方法是否意味着删除JPanel中的内容并像渲染一样重新绘制整个组件Java图形绘制方法执行流,java,class,action,paint,abstract,Java,Class,Action,Paint,Abstract,我遇到了这个密码。在编程过程中遇到任何问题之前,我想我可以缓解这种困惑。我很难理解绘画或actionPerformed方法是在Board类中首先执行的。我希望我的java评论是正确的 问题是,我在夏天学习了Java入门课程,而图形只是在课程快结束时才开始学习的。该类使用ImageIcon,我们从未接触过drawImage方法和Image抽象类。我也一点也不懂画法。这段代码比我上过的Java图形课要复杂得多。基于javaapi,paint方法起源于JComponent类,JComponent类是J
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();
}
}
如果我错了,有人可以纠正我 是的,图形是一个抽象类。但是任何继承图形的类(如Graphics2D)的实例都可以作为图形传递。如果我没记错的话,这是呼叫升级。g由名为paint()的UI线程传递,这可能是因为该对象已无效或必须更新
图形对象是对用户显示的实际位图的引用。如果我错了,有人可以纠正我 是的,图形是一个抽象类。但是任何继承图形的类(如Graphics2D)的实例都可以作为图形传递。如果我没记错的话,这是呼叫升级。g由名为paint()的UI线程传递,这可能是因为该对象已无效或必须更新 图形对象是对用户显示的实际位图的引用。用Java(以及基本上所有当前的窗口系统)绘图遵循好莱坞原则: 你不给我打电话;我打电话给你 也就是说,您可以告诉系统某个区域需要重新绘制(
repaint()
)。但您必须等到系统调用您进行绘图。在Java中,系统将调用paint()
方法,并将传递给您一个Graphics
实例以用于绘图
因此,事件的顺序是:
actionPerformed()
paint()
图形
通常称为图形上下文。它是用来画画的东西。根据系统和当前要求,图形可能直接进入屏幕或进入屏幕外缓冲区,然后复制到屏幕上。图形
实例负责细节。Java绘图(基本上是所有当前的窗口系统)遵循好莱坞原则:
你不给我打电话;我打电话给你
也就是说,您可以告诉系统某个区域需要重新绘制(repaint()
)。但您必须等到系统调用您进行绘图。在Java中,系统将调用paint()
方法,并将传递给您一个Graphics
实例以用于绘图
因此,事件的顺序是:
actionPerformed()
paint()
图形
通常称为图形上下文。它是用来画画的东西。根据系统和当前要求,图形可能直接进入屏幕或进入屏幕外缓冲区,然后复制到屏幕上。Graphics
实例负责处理细节。我认为您提出的大部分问题以及您尚未提出(但将要提出)的要点都可以在这里得到回答:请注意,您应该覆盖paintComponent(…)
而不是paint(…)
。请注意,repaint()
仅向绘制管理器建议应绘制GUI,并且不总是在绘制后调用绘制(…),尤其是在绘制调用“堆叠”的情况下。而repaint()不会擦除任何内容。执行擦除操作的是super paint(…)或paintComponent(…)
调用。前者和后者有什么不同?paintComponent表示它将调用paint方法。为什么会有这个额外的过程?请阅读链接。您将看到paintComponent不调用paint!更像是visa versa。另外,请阅读关于双缓冲的内容。谢谢链接。我会仔细阅读的!我认为您要问的大部分问题以及您尚未问(但将要问)的要点都可以在这里得到回答:请注意,您应该覆盖paintComponent(…)
而不是paint(…)
。请注意,repaint()
仅向绘制管理器建议应绘制GUI,并且不总是在绘制后调用绘制(…),尤其是在绘制调用“堆叠”的情况下。而repaint()不会擦除任何内容。执行擦除操作的是super paint(…)或paintComponent(…)
调用。前者和后者有什么不同?paintComponent表示它将调用paint方法。为什么会有这个额外的过程?请阅读链接。您将看到paintComponent不调用paint!更像是visa versa。另外,请阅读关于双缓冲的内容。谢谢链接。我会仔细阅读的!图形对象不是对查看图像的引用,但可以将其视为可以在查看图像上绘制的笔。另外,我认为Java在将Graphics2D对象放入图形变量时会向下转换,但在这方面我有点生疏。Graphics对象不是对查看图像的引用,但可以被认为是可以用来画画的笔