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); }}
什么时候需重写?怎么重写?这个问题困扰我一个星期了,查了好多书都没有写清楚.比例下面这个程序在窗口里画一个椭圆,伸缩大小或最大化窗口,怎么椭圆就没有了,最小化又最大化又出来了.
总之你自己实验一下.一定要试一下.到底这些方法是怎么个调用法的?我们要改变它的动作时怎么重写?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); }}
然后把这个panel添加到JFrame中去.
在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()就行了,其他的,呵呵,平时就当它们不存在吧~~
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);
}
}
楼主说的repaint()方法:我们在适当的地方调用repaint()方法,此方法会自动调用paintComponent方法,所以我们无需对paintComponent方法进行明显的调用。