1、实现屏幕截图的小程序java课程设计 经济与管理学院信息管理与信息系统专业 java实验周报告 (2015/2016学年 第一学期) 学生姓名: 学生班级: 学生学号: 指导教师: 2015年12月25日 实现屏幕截图的小程序一、实验题目实现屏幕截图的小程序二、实验要求编程一个应用小程序,能够具有屏幕截图的功能,截图的具体实现有:(1)显示出工作区域,即能够截屏的面积;(2)鼠标可以随意滑动进行截图;(3)将所截取的图片保存在想要保存的位置;(4)程序结束后可以退出整个应用。三、程序流程图3.1 业务流程图4、技术原理程序的主类是cutScreen,继承自无边框的框架JWindow;cutSc
2、reen()是一个定义屏幕尺寸的构造方法;使用方法mousePressed(MouseEvent e)来监听当前鼠标点击的动作;用方法mouseReleased(MouseEvent e)监听鼠标松开时,显示操作窗口;方法mouseDragged(MouseEvent e)监听拖动鼠标;paint(Graphics g)画出指定的工作区域;saveImage()保存图像。工具栏ToolsWindow类,继承自有边框的框架JFrame;方法init()用来设置布局方式为BorderLayout;run()捕捉屏幕截图。五、附实验代码import java.awt.*;import java.aw
3、t.event.*;import java.awt.image.BufferedImage;import java.awt.image.RescaleOp;import java.io.File;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;import javax.imageio.ImageIO;import javax.swing.*;import javax.swing.filechooser.FileNameExtensionFilter;import javax.s
4、wing.filechooser.FileSystemView;/Jwindow 是一个无边框的框架 public class cutScreen extends JWindow /beginX 开始的横坐标; beginY开始的纵坐标 private int beginX, beginY, endX, endY; private BufferedImage image = null; private BufferedImage tempImage = null; private BufferedImage saveImage = null; private ToolsWindow tools
5、 = null; /构造方法 public cutScreen() throws AWTException, IOException / 获取屏幕尺寸宽和高 int width = Toolkit.getDefaultToolkit().getScreenSize().width; int height = Toolkit.getDefaultToolkit().getScreenSize().height; / 设置窗口大小 /(0, 0, width, height)第一个0代表横坐标 ,第二个代表纵坐标 this.setBounds(0, 0, width, height); / 截取屏
6、幕 Robot robot = new Robot(); /参数Rectangle是代表工作区域 image = robot.createScreenCapture(new Rectangle(0, 0, width, height); ImageIO.write(image, jpg, new File(d:/1); / 本窗口添加监听(适配器) this.addMouseListener(new MouseAdapter() Override /当前鼠标点击动作 public void mousePressed(MouseEvent e) beginX = e.getX(); beginY
7、 = e.getY(); if (tools != null) tools.setVisible(false); Override public void mouseReleased(MouseEvent e) / 鼠标松开时,显示操作窗口 if (tools = null) tools = new ToolsWindow(cutScreen.this, e.getX(), e.getY(); else tools.setLocation(e.getX(), e.getY(); tools.setVisible(true); / 将此窗口置于前端,并可以将其设为焦点 Window tools.
8、toFront(); ); / 监听拖动鼠标 this.addMouseMotionListener(new MouseMotionAdapter() Override public void mouseDragged(MouseEvent e) / 鼠标拖动时,记录坐标并重绘窗口 endX = e.getX(); endY = e.getY(); / 临时图像,用于缓冲屏幕区域放置屏幕闪烁 Image tempImage2 = createImage(cutScreen.this.getWidth(), cutScreen.this.getHeight(); Graphics g = tem
9、pImage2.getGraphics(); g.drawImage(tempImage, 0, 0, null); int x = Math.min(beginX, endX); int y = Math.min(beginY, endY); int width2 = Math.abs(endX - beginX) + 1; int height2 = Math.abs(endY - beginY) + 1; g.drawRect(x - 1, y - 1, width2 + 1, height2 + 1); / 生成子区域流图片 saveImage = image.getSubimage(
10、x, y, width2, height2); /画出图片 g.drawImage(saveImage, x, y, null); /绘制当前指定的区域的图片 cutScreen.this.getGraphics().drawImage(tempImage2, 0, 0, cutScreen.this); ); / Override /画出指定的工作区域 public void paint(Graphics g) /进行逐像素重缩放 RescaleOp ro = new RescaleOp(0.8f, 0, null); tempImage = ro.filter(image, null);
11、g.drawImage(tempImage, 0, 0, this); / 保存图像到文件 public void saveImage() throws IOException JFileChooser jfc = new JFileChooser(); jfc.setDialogTitle(保存); / 文件过滤器,用户过滤可选择文件 FileNameExtensionFilter filter = new FileNameExtensionFilter(JPG, jpg); jfc.setFileFilter(filter); / 初始化一个默认文件(此文件会生成到桌面上) / 生成时间
12、SimpleDateFormat sdf = new SimpleDateFormat(yyyymmddHHmmss); String fileName = sdf.format(new Date(); File filePath = FileSystemView.getFileSystemView().getHomeDirectory(); File defaultFile = new File(filePath + File.separator + fileName + .jpg); jfc.setSelectedFile(defaultFile); int flag = jfc.show
13、SaveDialog(this); if (flag = JFileChooser.APPROVE_OPTION) File file = jfc.getSelectedFile(); String path = file.getPath(); /System.out.println(path); / 检查文件后缀,放置用户忘记输入后缀或者输入不正确的后缀 if (!(path.endsWith(.jpg) | path.endsWith(.JPG) path += .jpg; / 写入文件 ImageIO.write(saveImage, jpg, new File(path); Syste
14、m.exit(0); /* * 操作窗口 */ /ToolsWindow 内部类 class ToolsWindow extends JFrame private cutScreen parent; /构造函数(cutScreen,int x, int y)x代表鼠标释放位置的横坐标, public ToolsWindow(cutScreen parent, int x, int y) this.parent = parent; this.init(); this.setLocation(x, y); /让窗口里面的组建确定为最佳大小 this.pack(); this.setVisible(true); private void init() /设置布局方式为BorderLayout this.setLayout(new BorderLayout(); /工具栏 JTool
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1