Java图形绘制方法执行流

Java图形绘制方法执行流,java,class,action,paint,abstract,Java,Class,Action,Paint,Abstract,我遇到了这个密码。在编程过程中遇到任何问题之前,我想我可以缓解这种困惑。我很难理解绘画或actionPerformed方法是在Board类中首先执行的。我希望我的java评论是正确的 问题是,我在夏天学习了Java入门课程,而图形只是在课程快结束时才开始学习的。该类使用ImageIcon,我们从未接触过drawImage方法和Image抽象类。我也一点也不懂画法。这段代码比我上过的Java图形课要复杂得多。基于javaapi,paint方法起源于JComponent类,JComponent类是J

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

问题是,我在夏天学习了Java入门课程,而图形只是在课程快结束时才开始学习的。该类使用ImageIcon,我们从未接触过drawImage方法和Image抽象类。我也一点也不懂画法。这段代码比我上过的Java图形课要复杂得多。基于javaapi,paint方法起源于JComponent类,JComponent类是JPanel的超类

那么,画图方法所采用的参数g是什么,我应该如何考虑?paint方法如何知道要绘制图形类的哪个对象。我看了JavaAPI,它说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();
    }

}

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

是的,图形是一个抽象类。但是任何继承图形的类(如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对象不是对查看图像的引用,但可以被认为是可以用来画画的笔