paint() update() paintComponent() paintComponent()这些方法是怎么调用的?什么时候需重写?

linsea 2007-12-20 12:33:16
paint() update() repaint() paintComponent()这些方法是怎么自动调用的?
什么时候需重写?怎么重写?

这个问题困扰我一个星期了,查了好多书都没有写清楚.

比例下面这个程序在窗口里画一个椭圆,伸缩大小或最大化窗口,怎么椭圆就没有了,最小化又最大化又出来了.
总之你自己实验一下.一定要试一下.

到底这些方法是怎么个调用法的?我们要改变它的动作时怎么重写?

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.*;

public class FrameDraw extends JFrame{

public void paint(Graphics g){
g.fillOval(50, 50, 200, 300);

}


public static void main(String[] args) {
FrameDraw fd = new FrameDraw();
fd.setSize(400, 400);
fd.setVisible(true);
fd.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

}
...全文
422 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Laughing 2007-12-24
  • 打赏
  • 举报
回复
在paintComponent方法中的第一行写super.paintComponent(g);的作用:清除面板中的内容,也就是重绘;(说的简单点也就是,当你在JPanel中画了许多图形,在调用paintComponent方法时,super.paintComponent(g);会将JPanel中的这些图形全部清除,然后再重新绘制。)
楼主说的repaint()方法:我们在适当的地方调用repaint()方法,此方法会自动调用paintComponent方法,所以我们无需对paintComponent方法进行明显的调用。
jpinglove 2007-12-22
  • 打赏
  • 举报
回复
学习!
stevech 2007-12-21
  • 打赏
  • 举报
回复
package tmp;

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.*;

public class FrameDraw extends JFrame{
public static void main(String[] args) {
FrameDraw fd = new FrameDraw();
fd.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

fd.getContentPane().add(new JPanel() {
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.fillOval(50, 50, 200, 300);
}
});
fd.setSize(400, 400);
fd.setVisible(true);
}
}
stevech 2007-12-21
  • 打赏
  • 举报
回复
在Swing关于显示有一个大总管:RepaintManager,它负责调用各个method来显示组件。
在Swing中update()等同于paint(),在Swing中update()没用,它的存在仅仅是为了与AWT的相似。

paint()的作用与AWT中的paint()也完全不一样,而且工作机制比较复杂,我也说不很清楚,好像涉及到脏区(dirty region)、paintImmediately()、paintWithBuffer()等等,反正比较头疼。还好一般不用它,只有研究Swing机制的人才有工夫慢慢去研究吧,呵呵~~

JComponet中有三个repaint(),两个自己定义的,带参数。一个继承自java.awt.Container,不带参数。
调用repaint()将整个组件重新显示。

paintComponent()主要是调用UI delegate(参考Swing的MVC结构)中的方法来显示组件。一般我们主要是重载它来定制我们的组件外观。

所以,说来说去,搞明白paintComponent()就行了,其他的,呵呵,平时就当它们不存在吧~~
linsea 2007-12-21
  • 打赏
  • 举报
回复
楼上的,不会吧?!
guoyueshan 2007-12-20
  • 打赏
  • 举报
回复
我试了你的代码,伸缩大小或最大化窗口,椭圆还在啊
flushtime 2007-12-20
  • 打赏
  • 举报
回复
你应该继承一个JPanel类,复写其paintComponent方法,把你 要绘制图像的代码写在其中.
然后把这个panel添加到JFrame中去.

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧