Java实现屏幕截图工具的代码怎么写
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章主要讲解了"Java实现屏幕截图工具的代码怎么写",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Java实现屏幕截图工具的代码怎么写"吧!效果展
千家信息网最后更新 2025年11月07日Java实现屏幕截图工具的代码怎么写
这篇文章主要讲解了"Java实现屏幕截图工具的代码怎么写",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Java实现屏幕截图工具的代码怎么写"吧!
效果展示
程序运行后的截图:
先测试一下功能:
截图过程对界面的捕捉:
双击保存后的显示界面:

后续的步骤就自己去尝试吧,这里给出了简单的测试过程。
程序结构
核心代码
CaptureScreen.java类
/** * CaptureScreen.java */import java.awt.*;import java.awt.datatransfer.DataFlavor;import java.awt.datatransfer.Transferable;import java.awt.datatransfer.UnsupportedFlavorException;import java.awt.event.*;import javax.swing.*;import java.io.*;import javax.imageio.*;import java.awt.image.*;public class CaptureScreen extends JFrame implements ActionListener { private JButton start,cancel; private JPanel c; private BufferedImage get; private JTabbedPane jtp;//一个放置很多份图片 private int index;//一个一直会递增的索引,用于标认图片 private JRadioButton java,system;//JAVA界面,系统界面 /** Creates a new instance of CaptureScreen */ public CaptureScreen() { super("屏幕截取"); try{ UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); }catch(Exception exe){ exe.printStackTrace(); } initWindow(); initOther(); } private void initOther(){ jtp=new JTabbedPane(JTabbedPane.TOP,JTabbedPane.SCROLL_TAB_LAYOUT); } private void initWindow(){ start=new JButton("开始截取"); cancel=new JButton("退出"); start.addActionListener(this); cancel.addActionListener(this); JPanel buttonJP=new JPanel(); c=new JPanel(new BorderLayout()); JLabel jl=new JLabel("屏幕截取", JLabel.CENTER); jl.setFont(new Font("黑体",Font.BOLD,40)); jl.setForeground(Color.RED); c.add(jl,BorderLayout.CENTER); buttonJP.add(start); buttonJP.add(cancel); buttonJP.setBorder(BorderFactory.createTitledBorder("公共操作区")); JPanel jp=new JPanel();//放置两个单选按钮的面板 jp.add(java=new JRadioButton("java界面")); jp.add(system=new JRadioButton("系统界面",true)); java.addActionListener(this); system.addActionListener(this); jp.setBorder(BorderFactory.createTitledBorder("界面风格")); ButtonGroup bg=new ButtonGroup(); bg.add(java); bg.add(system); JPanel all=new JPanel(); all.add(jp); all.add(buttonJP); this.getContentPane().add(c,BorderLayout.CENTER); this.getContentPane().add(all,BorderLayout.SOUTH); this.setSize(500,400); this.setLocationRelativeTo(null); this.setVisible(true); this.setAlwaysOnTop(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } private void updates(){ this.setVisible(true); if(get!=null){ //如果索引是0,则表示一张图片都没有被加入过, //则要清除当前的东西,重新把tabpane放进来 if(index==0){ c.removeAll(); c.add(jtp,BorderLayout.CENTER); }else{//否则的话,直接对tabpane添加面板就可以了 //就什么都不用做了 } PicPanel pic=new PicPanel(get); jtp.addTab("图片"+(++index),pic); jtp.setSelectedComponent(pic); SwingUtilities.updateComponentTreeUI(c); // 调整LookAndFeel(javax.swing) } } private void doStart(){ try{ this.setVisible(false); Thread.sleep(500);//睡500毫秒是为了让主窗完全不见 Robot ro=new Robot(); // (通过本地操作)控制鼠标、键盘等实际输入源(java.awt) Toolkit tk=Toolkit.getDefaultToolkit(); // AWT组件的抽象父类(java.awt) Dimension di=tk.getScreenSize(); Rectangle rec=new Rectangle(0,0,di.width,di.height); BufferedImage bi=ro.createScreenCapture(rec); JFrame jf=new JFrame(); Temp temp=new Temp(jf,bi,di.width,di.height); // 自定义的Temp类的对象 jf.getContentPane().add(temp,BorderLayout.CENTER); jf.setUndecorated(true); jf.setSize(di); jf.setVisible(true); jf.setAlwaysOnTop(true); } catch(Exception exe){ exe.printStackTrace(); } } /** *公用的处理保存图片的方法 */ public void doSave(BufferedImage get){ try{ if(get==null){ JOptionPane.showMessageDialog(this , "图片不能为空!!", "错误", JOptionPane.ERROR_MESSAGE); return; } JFileChooser jfc=new JFileChooser("."); jfc.addChoosableFileFilter(new GIFfilter()); jfc.addChoosableFileFilter(new BMPfilter()); jfc.addChoosableFileFilter(new JPGfilter()); jfc.addChoosableFileFilter(new PNGfilter()); int i=jfc.showSaveDialog(this); if(i==JFileChooser.APPROVE_OPTION){ File file=jfc.getSelectedFile(); String about="PNG"; String ext=file.toString().toLowerCase(); javax.swing.filechooser.FileFilter ff=jfc.getFileFilter(); if(ff instanceof JPGfilter){ if(!ext.endsWith(".jpg")){ String ns=ext+".jpg"; file=new File(ns); about="JPG"; } } else if(ff instanceof PNGfilter){ if(!ext.endsWith(".png")){ String ns=ext+".png"; file=new File(ns); about="PNG"; } }else if(ff instanceof BMPfilter){ if(!ext.endsWith(".bmp")){ String ns=ext+".bmp"; file=new File(ns); about="BMP"; } }else if(ff instanceof GIFfilter){ if(!ext.endsWith(".gif")){ String ns=ext+".gif"; file=new File(ns); about="GIF"; } } if(ImageIO.write(get,about,file)){ JOptionPane.showMessageDialog(this,"保存成功!"); } else JOptionPane.showMessageDialog(this,"保存失败!"); } } catch(Exception exe){ exe.printStackTrace(); } } /** *公共的处理把当前的图片加入剪帖板的方法 */ public void doCopy(final BufferedImage image){ try{ if(get==null){ JOptionPane.showMessageDialog(this ,"图片不能为空!!","错误",JOptionPane.ERROR_MESSAGE); return; } // java.awt.datatransfer(接口) Transferable trans = new Transferable(){ // 内部类 public DataFlavor[] getTransferDataFlavors() { return new DataFlavor[] { DataFlavor.imageFlavor }; } public boolean isDataFlavorSupported(DataFlavor flavor) { return DataFlavor.imageFlavor.equals(flavor); } public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { if(isDataFlavorSupported(flavor)) return image; throw new UnsupportedFlavorException(flavor); } }; Toolkit.getDefaultToolkit().getSystemClipboard().setContents(trans, null); JOptionPane.showMessageDialog(this,"已复制到系统粘帖板!!"); }catch(Exception exe){ exe.printStackTrace(); JOptionPane.showMessageDialog(this ,"复制到系统粘帖板出错!!","错误",JOptionPane.ERROR_MESSAGE); } } //处理关闭事件 private void doClose(Component c){ jtp.remove(c); c=null; System.gc(); } public void actionPerformed(ActionEvent ae){ Object source=ae.getSource(); if(source==start){ doStart(); } else if(source==cancel){ System.exit(0); }else if(source==java){ // 金属外观 try{ UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); SwingUtilities.updateComponentTreeUI(this); }catch(Exception exe){ exe.printStackTrace(); } }else if(source==system){ // 本地外观 try{ UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); SwingUtilities.updateComponentTreeUI(this); }catch(Exception exe){ exe.printStackTrace(); } } } //一个内部类,它表示一个面板,一个可以被放进tabpane的面板 //也有自己的一套处理保存和复制的方法 private class PicPanel extends JPanel implements ActionListener{ JButton save,copy,close;//表示保存,复制,关闭的按钮 BufferedImage get;//得到的图片 public PicPanel(BufferedImage get){ super(new BorderLayout()); this.get=get; initPanel(); } private void initPanel(){ save=new JButton("保存(S)"); copy=new JButton("复制到剪帖板(C)"); close=new JButton("关闭(X)"); save.setMnemonic('S'); copy.setMnemonic('C'); close.setMnemonic('X'); JPanel buttonPanel=new JPanel(); buttonPanel.add(copy); buttonPanel.add(save); buttonPanel.add(close); JLabel icon=new JLabel(new ImageIcon(get)); this.add(new JScrollPane(icon),BorderLayout.CENTER); this.add(buttonPanel,BorderLayout.SOUTH); save.addActionListener(this); copy.addActionListener(this); close.addActionListener(this); } public void actionPerformed(ActionEvent e) { Object source=e.getSource(); if(source==save){ doSave(get); }else if(source==copy){ doCopy(get); }else if(source==close){ get=null; doClose(this); } } } //保存BMP格式的过滤器 private class BMPfilter extends javax.swing.filechooser.FileFilter{ public BMPfilter(){ } public boolean accept(File file){ if(file.toString().toLowerCase().endsWith(".bmp")|| file.isDirectory()){ return true; } else return false; } public String getDescription(){ return "*.BMP(BMP图像)"; } } //保存JPG格式的过滤器 private class JPGfilter extends javax.swing.filechooser.FileFilter{ public JPGfilter(){ } public boolean accept(File file){ if(file.toString().toLowerCase().endsWith(".jpg")|| file.isDirectory()){ return true; } else return false; } public String getDescription(){ return "*.JPG(JPG图像)"; } } //保存GIF格式的过滤器 private class GIFfilter extends javax.swing.filechooser.FileFilter{ public GIFfilter(){ } public boolean accept(File file){ if(file.toString().toLowerCase().endsWith(".gif")|| file.isDirectory()){ return true; } else return false; } public String getDescription(){ return "*.GIF(GIF图像)"; } } //保存PNG格式的过滤器 private class PNGfilter extends javax.swing.filechooser.FileFilter{ public boolean accept(File file){ if(file.toString().toLowerCase().endsWith(".png")|| file.isDirectory()){ return true; } else return false; } public String getDescription(){ return "*.PNG(PNG图像)"; } } //一个临时类,用于显示当前的屏幕图像 private class Temp extends JPanel implements MouseListener,MouseMotionListener{ private BufferedImage bi; private int width,height; private int startX,startY,endX,endY,tempX,tempY; private JFrame jf; private Rectangle select=new Rectangle(0,0,0,0);//表示选中的区域 private Cursor cs=new Cursor(Cursor.CROSSHAIR_CURSOR);//表示一般情况下的鼠标状态(十字线) private States current=States.DEFAULT;// 表示当前的编辑状态 private Rectangle[] rec;//表示八个编辑点的区域 //下面四个常量,分别表示谁是被选中的那条线上的端点 public static final int START_X=1; public static final int START_Y=2; public static final int END_X=3; public static final int END_Y=4; private int currentX,currentY;//当前被选中的X和Y,只有这两个需要改变 private Point p=new Point();//当前鼠标移的地点 private boolean showTip=true;//是否显示提示.如果鼠标左键一按,则提示就不再显示了 public Temp(JFrame jf,BufferedImage bi,int width,int height){ this.jf=jf; this.bi=bi; this.width=width; this.height=height; this.addMouseListener(this); this.addMouseMotionListener(this); initRecs(); } private void initRecs(){ rec=new Rectangle[8]; for(int i=0;iendX?startX:endX)-5,y-5,10,10); rec[3]=new Rectangle((startX>endX?startX:endX)-5,y1-5,10,10); rec[4]=new Rectangle((startX>endX?startX:endX)-5,(startY>endY?startY:endY)-5,10,10); rec[5]=new Rectangle(x1-5,(startY>endY?startY:endY)-5,10,10); rec[6]=new Rectangle(x-5,(startY>endY?startY:endY)-5,10,10); rec[7]=new Rectangle(x-5,y1-5,10,10); if(showTip){ g.setColor(Color.CYAN); g.fillRect(p.x,p.y,170,20); g.setColor(Color.RED); g.drawRect(p.x,p.y,170,20); g.setColor(Color.BLACK); g.drawString("请按住鼠标左键不放选择截图区",p.x,p.y+15); } } //根据东南西北等八个方向决定选中的要修改的X和Y的座标 private void initSelect(States state){ switch(state){ case DEFAULT: currentX=0; currentY=0; break; case EAST: currentX=(endX>startX?END_X:START_X); currentY=0; break; case WEST: currentX=(endX>startX?START_X:END_X); currentY=0; break; case NORTH: currentX=0; currentY=(startY>endY?END_Y:START_Y); break; case SOUTH: currentX=0; currentY=(startY>endY?START_Y:END_Y); break; case NORTH_EAST: currentY=(startY>endY?END_Y:START_Y); currentX=(endX>startX?END_X:START_X); break; case NORTH_WEST: currentY=(startY>endY?END_Y:START_Y); currentX=(endX>startX?START_X:END_X); break; case SOUTH_EAST: currentY=(startY>endY?START_Y:END_Y); currentX=(endX>startX?END_X:START_X); break; case SOUTH_WEST: currentY=(startY>endY?START_Y:END_Y); currentX=(endX>startX?START_X:END_X); break; default: currentX=0; currentY=0; break; } } public void mouseMoved(MouseEvent me){ doMouseMoved(me); initSelect(current); // current:当前状态(state) if(showTip){ p=me.getPoint(); repaint(); } } //特意定义一个方法处理鼠标移动,是为了每次都能初始化一下所要选择的区域 private void doMouseMoved(MouseEvent me){ if(select.contains(me.getPoint())){ this.setCursor(new Cursor(Cursor.MOVE_CURSOR)); current=States.MOVE; } else{ States[] st=States.values(); for(int i=0;i=this.getWidth()){ wid=this.getWidth()-select.x; } if(select.y+select.height>=this.getHeight()){ het=this.getHeight()-select.y; } get=bi.getSubimage(select.x,select.y,wid,het); jf.dispose(); updates(); } } } } } public static void main(String args[]) { SwingUtilities.invokeLater(new Runnable(){ public void run(){ new CaptureScreen(); } }); }}//一些表示状态的枚举enum States{ NORTH_WEST(new Cursor(Cursor.NW_RESIZE_CURSOR)),//表示西北角 NORTH(new Cursor(Cursor.N_RESIZE_CURSOR)), NORTH_EAST(new Cursor(Cursor.NE_RESIZE_CURSOR)), EAST(new Cursor(Cursor.E_RESIZE_CURSOR)), SOUTH_EAST(new Cursor(Cursor.SE_RESIZE_CURSOR)), SOUTH(new Cursor(Cursor.S_RESIZE_CURSOR)), SOUTH_WEST(new Cursor(Cursor.SW_RESIZE_CURSOR)), WEST(new Cursor(Cursor.W_RESIZE_CURSOR)), MOVE(new Cursor(Cursor.MOVE_CURSOR)), DEFAULT(new Cursor(Cursor.DEFAULT_CURSOR)); private Cursor cs; States(Cursor cs){ this.cs=cs; } public Cursor getCursor(){ return cs; }} 感谢各位的阅读,以上就是"Java实现屏幕截图工具的代码怎么写"的内容了,经过本文的学习后,相信大家对Java实现屏幕截图工具的代码怎么写这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
图片
屏幕
截图
界面
鼠标
代码
图像
状态
处理
工具
方法
格式
系统
过滤器
面板
区域
情况
错误
学习
两个
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库安全访问的代码
计算机网络安全期末
部队网络安全问题形势分析
es怎么查询数据库
数据库性能管理及架构设计
汽车车载网络技术论文
迅游服务器ip
显示服务器时间
bt tracker服务器
网络安全原理与应用 答案
服务器安全狗封ip
vb软件开发流程
出租屋云端数据库
高校网络安全知识答题
网络安全威胁地图下载
网络安全专项检查动员部署会
吴江区进口服务器高质量的选择
超市常见货品条码数据库下载
购买一个微信小程序服务器费用
臻游网络安全绘画
win7网站服务器
小学中学网络安全答题
怎么看网站的数据库
植物大战僵尸ol服务器
论文查重通过后能录入数据库吗
2020软件开发创新大赛
edb数据库的字段查询
铁路职工网络安全意识
防汛网络安全预案
debian安装图形服务器