【问题标题】:Java graphics paint method execution flowJava图形绘制方法执行流程
【发布时间】: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


【解决方案1】:

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

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

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

所以事件的顺序是:

  1. actionPerformed()
  2. paint()

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

【讨论】:

  • 当你说系统时,你是指操作系统还是Java虚拟机?
  • @Nicholas:操作系统和 Java UI 库彼此紧密交互。因此,并不总是可以说出是谁发起了一项行动。我所描述的整体架构之后是所有具有窗口概念(我知道)的操作系统。所以主要是操作系统。
  • API 说 Graphics 是一个抽象类,所以我很困惑,可以有一个抽象类的实例。
  • @Nicholas:是的,Graphics 是一个抽象类。但是paint()方法的参数会包含一个具体类的实例,它是Graphics的子类。
  • @Nicholas 你可能会发现Painting in AWT and Swing 感兴趣
【解决方案2】:

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

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

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

【讨论】:

  • Graphics 对象不是对查看图像的引用,但可以将其视为可以在查看图像上绘图的笔。另外,我认为在将 Graphics2D 对象放入 Graphics 变量时,Java 向下转换,但我在这方面有点生疏。
猜你喜欢
  • 2012-11-07
  • 1970-01-01
  • 1970-01-01
  • 2010-11-19
  • 2012-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-13
相关资源
最近更新 更多