repaintjava
⑴ java中的repaint和paint
有两点不同:1、repaint有选择的调用update或者paintrepaint() = update或者paint,对于轻量级组件,repaint会调用paint;而对于重量级组件,会调用update。update一般的工作是清屏然后paint。至于为什么repaint度轻量级和重量级的处理有所不同,如果你一定希望知道再追问我。你也可以自己重写update完成自己定制的工作。2、响应方式不一样paint立即响应,而repaint则是发出重绘请求,等待awt线程选择合适的时间进行重绘。这就像,你是一个画家,而你还雇了另外一个画家——awt。有两个方法,完成绘图,第一交给awt线程,但是他什么时候完成绘画完全取决于awt的心情;第二你自己来画,这样更确定,但是你不得不管理许多细节。在非paint方法中,显示的调用任何paint方法,就相当于你自己来画;而repaint就是发出请求交给awt来画。显然我们应该确定究竟谁来画,因为两者交织的画可能带来冲突。比如awt正在绘制的过程中,你的程序乱入,在他绘制一半的图片上涂涂抹抹……。当然java的设计者希望我们把绘制全权交给awt线程来画,而不是自己来画!因为这样最安全和省事。但是我仍然认为在Java游戏编程中还是自己来管理绘制更加灵活。补充: 晕死,你不问我。我都和你说了,paint会马上绘制,repaint是发出请求,awt接到这给请求之后就会等待,直到awt认为合适的时候才进行绘制。另外就是repaint会处理一些重量级组件的绘制,如Frame。但是paint只是重绘轻量级组件。至于你的程序中用repaint会防止绘制过程中的冲突;而如果你直接调用paint,立即绘制也许会造成你和awt线程同时绘制这个组件,造成冲突。你需要理解Java的GUI如何工作的。Java有一个awt线程,负责所有的绘制工作,任何绘制请求都应该交给他(也就是调用repaint),而不是自己调用paint(至少java的设计者是这样要求我们的,为的就是防止冲突)。Java需要每一个组件管理自身的绘制。假设某容器A上有按钮B、C、D。Java绘制一个组件A的过程是这样的,发出绘制请求-awt接到请求-awt开始绘制-组件A绘制自身-如果A组件为容器,则调用add到该容器中的所有组件B、C、D……等等的paint方法绘制这些组件。所以定义paint方法,仅仅是因为它是awt需要的一个接口,是为了满足“组件自身管理自身绘制方法”的要求。追问: 不好意思,只是你说的太专业了,我看不懂,那awt不知道,我只知道,原程序画出的圆是不闪烁的,如果我这个程序把repaint()移在末尾画出的圆就是闪烁的。说简单点吧,不然我不懂。回答: 那应该是你的public void itemStateChanged(ItemEvent e)方法总是被激发吧?你把完整代码贴出来补充:
⑵ java中的repaint方法
我的理解如下,老师讲的有欠缺,没有讲清楚这个方法的使用范围
java里repaint()是重绘component的方法;
component中己有的图形发生变化后不会立刻显示,须使用repaint方法。
⑶ Java中repaint方法具体怎么用
你得加一个线程就可以循环播放了 可以用Timer
我把你的代码改动了一下已经可以实现你要的效果了
public class LoadingPage extends JFrame {
DrawLoadingAnimation drawLoadingAnimation;
public LoadingPage() {
ImageIcon[] imageIcons = {
new ImageIcon("D:\\新建文件夹\\0.jpg"),
new ImageIcon("D:\\新建文件夹\\1.jpg"),
new ImageIcon("D:\\新建文件夹\\3.jpg")
};
drawLoadingAnimation = new DrawLoadingAnimation(imageIcons);
this.add(drawLoadingAnimation);
this.setSize(300, 200);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setTitle("");
this.setVisible(true);
Timer timer = new Timer(200, e -> {
drawLoadingAnimation.index = (drawLoadingAnimation.index + 1) % imageIcons.length;
repaint(1000,0,0,this.getWidth(),this.getHeight());
});
timer.start();
}
static class DrawLoadingAnimation extends JPanel {
int index = 0;
ImageIcon[] imageIcons;
public DrawLoadingAnimation(ImageIcon[] imageIcons) {
this.imageIcons = imageIcons;
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.drawImage(imageIcons[index].getImage(), 0, 0, this.getWidth(),this.getHeight(),null);
}
}
public static void main(String[] args) {
new LoadingPage();
}
}
⑷ java中repaint()方法到底应该怎么用
java里repaint()是重绘component的方法;
repaint()方法用于重绘组件,该方法有下面四种形式:
1。public void repaint()
2。public void repaint(long tm)
//指定调用update方法之前等待的最大毫秒数tm
3。public void repaint(int x,int y,int width,int height)
//重绘组件的指定矩形区域
4。public void repaint(ling tm,int x,int y,int width,int height)
repaint方法不总是马上执行,Java虽然会尽可能快的执行repaint,当Applet运行在较慢的平台上或计算机较忙时,应该考虑使用第2或4种repaint方法,指定在多长时间内必须执行repaint,否则就放弃。
repaint()这个方法是一个具有刷新页面效果的方法,如果你要页面进行重画就可以调用.一般都是在AWT的图形绘制当中调用的到.那么该方法具体的工作原来是怎么样的呢?看下面的结构流程图你就可以大概的了解了:
repaint()方法
|
|
V
AWT线程--->paint()方法-->图形绘制
|
|
V
update()方法--->paint()方法--图形绘制
从上面的流程图可以看出,在绘制动画图形时候如果没有调用repaint()方法的时候直接就是由线程调用paint()方法进行绘制,用repaint()进行刷新显示.但是这样的动画会有个缺点(这样的效果绘制出来会有闪烁).想想做出来的动画总是隔一段时间就闪烁,有人会看吗?那么应该怎么去除闪烁呢?我再下面的文章中会讲到.这里主要的是说明repaint()这个方法.
在调用了repaint()的时候我门可以看出,它并不是直接就去绘制动画(调用paint()),而是通过调用AWT线程在由线程去调用另一个方法update()再由update()调用画笔paint()方法进行绘制.那么这里为什么要多做一步呢?这样是不是为我门多增加代码的书写量呢?回答是当然不会,如果你不调用repaint()那么就不能实现每一次的刷新显示,就只会绘制重叠的图形,不能一张一张的绘制出来.那么其中调用的update()到底是起到什么样的作用呢?
update():清除当前显示并调用paint()方法.当然这个update()方法是可以被修改的,我门在另一篇文章关于"双缓冲技术"中会给大家讲到这点.
综合上面的介绍可以总结出repaint()的工作原理:repaint()通过调用线程再由线程去调用update()方法清除当前显示并再调用paint()方法进行绘制下一个需要显示的内容.这样就起到了一种图片的交替显示从而在视角上形成了动画.
⑸ Java JPanel中,repaint(),paint(),方法的区别
repaint方法调用时会向你的程序发送一个消息,要求重绘你的程序的窗口的无效区域。
但这个消息会首先保存到应用程序的消息队列,并不会马上得到处理。
每个图形用户界面应用程序都有一个消息循环,作用是不断地从应用程序消息队列提取各种消息并交由指定的方法进行处理。
所以,repaint方法的作用就是发送一个刷新窗口的消息到消息队列,而消息循环时如果提取到了这个repaint方法发送的消息,就会调用paint方法来处理这个消息。
即repaint只负责发送消息,而消息的处理是由paint方法完成的。
所以,应该重写paint方法,将绘图逻辑放置其中。
⑹ java里repaint();是干什么用的
java里repaint()是重绘component的方法;
component中己有的图形发生变化后不会立刻显示,须使用repaint方法。
component简而言之,组件就是对象。C++ Builder中叫组件,Delphi中叫部件,而在Visual BASIC中叫控件。
组件是对数据和方法的简单封装。C++ Builder中,一个组件就是一个从TComponent派生出来的特定对象。组件可以有自己的属性和方法。
⑺ java中repaint()怎么样能只清除某一条线怎么样可以不清楚原来已经画了的
一般来说你需要用一个数组或者其他数据结构来记录画的内容数据。然后 paint 的时候读取数组并对应地画到屏幕上。因为 paint 是不主动记录数据的,所以一旦画出来再要去掉就很麻烦,而且因为它不保存数据,所以一旦绘制区域被遮盖或者移出了屏幕区域就会整块被擦掉。
比如我举个例子,你要只画直线的话,可以用一个数组或两个数组记录两端点的坐标(如果要颜色等信息就同样可以很方便地扩展,比如加一个数组什么的)。如果一开始是不确定线条数的你就用一个 Vector 或者 ArrayList 来做个动态数组,反正把每条线的两端点都记录下来,然后删除一条线就只需要在数组中把对应的端点坐标 remove 掉,然后调用 repaint:
import java.util.Vector;
import java.awt.Graphics;
import java.awt.JPanel;
import java.awt.Point;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.KeyListener;
public class MyPanel extends JPanel implements MouseListener, MouseMotionListener, KeyListener {
private Vector<Point> endPoints1 = new Vector<Point>();
private Vector<Point> endPoints2 = new Vector<Point>();
public MyPanel () {
addMouseListener(this);
addMouseMotionListener(this);
addKeyListener(this);
}
@Override public void paint (Graphics g) {
super.paint(g);
for (int i=0; i<endPoints1.size(); i++)
g.drawLine(endPoints1.get(i).x, endPoints1.get(i).y, endPoints2.get(i).x, endPoints2.get(i).y);
requestFocus();
}
......//其他你自己写
public void addLine (Point p1, Point p2) {
endPoints1.add(p1);
endPoints2.add(p2);
repaint(); //在这里调用 repaint
}
public void removeLine (Point p1, Point p2) {
endPoints1.remove(p1);
endPoints2.remove(p2);
repaint(); //同样在这里调用 repaint
}
}
剩下的包括选择删除哪条线之类的你自己写吧。这是一个整条线处理的例子,就是一个矢量图。如果只是位图的话那就是类似橡皮擦的工具,在屏幕上画一个和背景颜色相同的小矩形或者圆形覆盖掉那个区域就行了。