前言
本文讲述了按照常规思路,如何思考将GUI窗口截图下来并保存的问题
一、如何实现截图?
方法三是最终的解决方案,前面两个是我个人的想法,若不想看可直接跳到方法三
1.截图的过程
首先,截图的结果是一张图片,那么我们就需要先创建一张图片作为截图结果的载体,把截取的内容绘制到这张图片里,然后再将这张图片保存
2.方法一
因为需要将窗体绘制到一张图片里,而窗体的内容是被绘制进Graphics中的,我们会理所当然的想到能不能用某种方法,用窗体的Graphics去创建一个BufferedImage,然后直接保存此BufferedImage,经过帮助文档一番查阅,没有发现此类构造器和方法,本方法行不通。
3.方法二
用Graphics去创建一张BufferedImage中行不通,那么我们或许可以尝试一下获取BufferedImage的Graphics画笔,然后在这张图片的BufferedImage上绘制,绘制完成后,再将此BufferedImage保存就好了。
我去查阅了一下Graphics绘制相关的方法,发现有关在Graphics上绘制的方法基本上都是有关图形或者是字符串的,没有可以可以实现精确到像素的点级别的绘制方法,此方法也以失败告终。
4.方法三
前面两种方法都行不通,那我们去GUI的相关类里找找解决方法?
最终我在Componnet类中发现了paintAll()这个方法,这个方法可以将组件的Graphics绘制进指定的Graphics中。
二、代码片
1.引入库
代码如下:
try {
BufferedImage temp = new BufferedImage(table.getWidth(),table.getHeight(),BufferedImage.TYPE_3BYTE_BGR);
Graphics2D g2d = temp.createGraphics();
table.paintAll(g2d); //table是一个JPanel
ImageIO.write(temp,"png",new File("G:\\111.png"));
} catch (Exception ex) {
ex.printStackTrace();
}
2.结果展示
结语
一年时间过得真快啊。
不能为了编程而编程,而是在学习编程的过程中学会抓住问题的切入点,锻炼解决问题的能力,这样我们才能进步的更多。