改写基类方法后的调用问题.下面是代码,问题时代码中的两个paintComponent(Graphics g)方法是何时被调用的?谁调用的?

abel021wang 2013-06-12 11:52:13
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class DrawingExample implements ActionListener {
JFrame frame;
MyButton button;
MyPanel panel;
int tag = 1;

public static void main(String args[]) {
DrawingExample de = new DrawingExample();
de.go();
}

public void go() {
frame = new JFrame("Drawing Example");
button = new MyButton("Draw");
button.addActionListener(this);
frame.getContentPane().add(button,"South");

panel = new MyPanel();
frame.getContentPane().add(panel,"Center");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(360,200);
frame.setVisible(true);
}

public void actionPerformed(ActionEvent e) {
//按钮上的文本在Draw与Clear间切换
if (tag==0) {
tag = 1;
button.setText("Draw");
}else {
tag = 0;
button.setText("Clear");
}
panel.repaint();//重绘panel
}

//自定义的button
class MyButton extends JButton {
MyButton(String text) {
super(text);
}

protected void paintComponent(Graphics g){ //什么时候被调用?被谁调用?
super.paintComponent(g);
g.setColor(Color.red);
int width = getWidth();
int height = getHeight();
g.drawOval(4, 4, width-8, height-8);//绘制椭圆
}
}

//自定义的panel
class MyPanel extends JPanel {
protected void paintComponent(Graphics g){ //什么时候被调用?被谁调用?
super.paintComponent(g);
if (tag==0) {
g.setColor(Color.blue); //设置颜色
g.drawLine(40,25,30,50); //绘制直线
g.setColor(Color.green);
g.drawRect(100,50,100,46);//绘制矩形
g.setColor(Color.red);
g.drawRoundRect(73,32,56,37,10,16); //绘制圆角矩形
g.setColor(Color.yellow);
g.fillOval(180,60,60,45); //绘制填充椭圆
g.setColor(Color.pink);
g.fillArc(250,32,90,60,15,30); //绘制填充圆弧
}
}
}
}
...全文
152 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
熏肉大饼 2013-06-17
  • 打赏
  • 举报
回复
repaint调用update 再调用paint paintComponent是一个被保护的方法,因为API上建议不直接重写paint方法 在重绘时重量级组件 最好重写update方法 轻量级组件 重写paint方法 因为这里的调用关系会造成绘制的延迟问题 导致你不能马上得到你要的效果 所以我一般不用repaint 而用papintImmediately();可以马上绘制出效果: 分享文章: http://blog.csdn.net/w5167839/article/details/9109955
逍遥jc 2013-06-15
  • 打赏
  • 举报
回复
我记得好像是控件有任何变化的时候都会进行重绘的。
ZHOU西口 2013-06-13
  • 打赏
  • 举报
回复
当java认为需要重新绘制组件的时候由java自动调用。比如你在程序中执行repaint();或者程序窗口最小化,然后恢复。或者程序窗口被遮挡,又显现的时候。我们平常并不用管这个方法,这个方法只在你需要继承paintComponent(一般是JFrame)的时候,重写方法,就可以了。

62,612

社区成员

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

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