java中repaint为什么用,java双缓冲中,为什么小弟我调用repaint时,它直接调用paint()而不是update(),如何改进...

java双缓冲中,为什么我调用repaint时,它直接调用paint()而不是update(),怎么改进?

Java codeimport java.awt.Graphics;

import java.awt.Image;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

import javax.swing.ImageIcon;

import javax.swing.JFrame;

public class pic extends JFrame{

Image image=null;

Image offscreen;

int hight=400;

int width=400;

public pic(){

this.setSize(hight,width);

this.addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent e) {

setVisible(false);

System.exit(0);

}

});

this.setResizable(false);

this.setVisible(true);

}

public void paint(Graphics g){

System.out.println("paint...");

}

public void update(Graphics g){

image=new ImageIcon("C:\\Users\\Administrator\\Desktop\\z.jpg").getImage();//路径改变

this.offscreen=this.createImage(hight,width);

Graphics goff=this.offscreen.getGraphics();

goff.drawImage(image,0,0,null);

System.out.println("update.....");

paint(goff);

g.drawImage(offscreen,0,0,null);

}

public static void main(String[] args) {

// TODO Auto-generated method stub

new pic().repaint();

}

}

为什么我调用repaint时,它直接调用paint()而不是update(),怎么改进?

------解决方案--------------------

不是JFrame 是Frame!另外,重绘最好放在另外一个线程

Java codeimport java.awt.Frame;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

import javax.swing.ImageIcon;

public class pic extends Frame implements Runnable{

Image image=null;

Image offscreen;

int hight=400;

int width=400;

public pic(){

this.setSize(hight,width);

this.addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent e) {

setVisible(false);

System.exit(0);

}

});

this.setResizable(false);

this.setVisible(true);

}

public void paint(Graphics g){

System.out.println("paint...");

}

public void update(Graphics g){

image=new ImageIcon("C:\\Users\\Administrator\\Desktop\\z.jpg").getImage();//路径改变

this.offscreen=this.createImage(hight,width);

Graphics goff=this.offscreen.getGraphics();

goff.drawImage(image,0,0,null);

System.out.println("update.....");

paint(goff);

g.drawImage(offscreen,0,0,null);

}

public static void main(String[] args) {

// TODO Auto-generated method stub

new Thread( new pic()).start();

}

@Override

public void run() {

while(true){

try {

Thread.sleep(50);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

repaint();

}

}

}

------解决方案--------------------

JFrame的update方法只是调用 paint(g)。重写此方法,以防止不必要的调用清除背景。

JFrame的repaint方法是由类 java.awt.Component 继承的方法,如果此组件是轻量级组件,则repaint方法会尽快调用此组件的 paint 方法。否则此方法会尽快调用此组件的 update 方法。

双缓冲绘图一般都不直接在JFrame上绘制,一般是用JFrame绘制组件吧。

JDK API doc 上面有你的问题的答案。

相关推荐

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值