投屏模块——MyCanvas类
运用里面的getImageAndPrintIt(BufferedImage bufferedImage)方法实现投屏,bufferedImage是提前画好的图片。
也就是说,只让Canvas实现投屏功能,把画图功能分离出去。
package madokast;
import java.awt.*;
import java.awt.image.BufferedImage;
public class MyCanvas extends Canvas {
//用于接收外来图片(已经在外面画好了)
private BufferedImage ImageToBePaint;
//对外的接口,用于得到外界的图片,在此中调用repaint()方法
public void getImageAndPrintIt(BufferedImage bufferedImage)
{
//拿到要画的图片
this.ImageToBePaint = bufferedImage;
//画图顺序:repaint()->update()->paint()
super.repaint();
}
@Override
//重写update方法,该方法原本用于清屏+调用paint()
//这个方法中的Graphics g的和paint(Graphics g)方法中的g,都是直接指向屏幕的画笔
//原本update()方法带有清屏功能,即g.clearRect(),用背景色重置屏幕
//在我的MyCanvas类中,这东西没必要,直接用下一张图片覆盖上一张即可,没必要清屏
//以前需要清屏是因为以前的画图写在了重写的paint()方法中,这个方法里我们只管画图,不管清屏
//重写update(),覆盖【清屏+调用paint()】的功能(等于paint不再被调用了————实际上还以被调用了一次...大概是初始化的时候)
//直接用这里的 g 绘制从getImageAndPrintIt(BufferedImage bufferedImage)得到的图片
public void update(Graphics g) {g.drawImage(ImageToBePaint,0,0,null); }
//paint(Graphics g)还是被调用了一次...不知道为什么
//@Override
//public void paint(Graphics g) {
// super.paint(g);
// int x=1/0;
//}
@Override
@Deprecated
//最后。不要用repaint(),应该使用getImageAndPrintIt(BufferedImage bufferedImage)
public void repaint() { super.repaint(); }
}
画图模块——一段main函数的小测试
package madokast;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
public class CanvasRelearnMain {
private static int x=0;
public static void main(String[] args) {
final int ImageWidth = 800;
final int ImageHeight = 600;
Frame frame = new Frame("测试");
MyCanvas myCanvas = new MyCanvas();
myCanvas.setBounds(0,0,ImageWidth,ImageHeight);
frame.add(myCanvas,BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
BufferedImage bufferedImage = new BufferedImage(ImageWidth,ImageHeight, BufferedImage.TYPE_INT_RGB);
Graphics pen = bufferedImage.createGraphics();
Color blue = new Color(0x0000FF);
Color red = new Color(0xFF0000);
Timer timer = new Timer(10,t->{
//清屏
pen.setColor(blue);
pen.fillRect(0,0,ImageWidth,ImageHeight);
//画图
pen.setColor(red);
pen.fillRect(x++,200,30,30);
//投屏
myCanvas.getImageAndPrintIt(bufferedImage);
});
timer.start();
}
}