Java实现屏幕截图工具的代码怎么写
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要讲解了"Java实现屏幕截图工具的代码怎么写",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Java实现屏幕截图工具的代码怎么写"吧!效果展
千家信息网最后更新 2026年10月31日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安全错误
数据库的锁怎样保障安全
互联网科技
互联网科技保险
互联网下的科技发展
互联网科技金融
互联网金融 金融科技
互联网女皇 腾讯科技
友谊互联网络科技
居家互联网科技有限公司
甘肃拓世互联网科技有限公司
开启互联网科技时代小说
上海宁丞科技互联网
湖南一路畅行互联网科技
互联网科技和信息
国大互联网教育科技有限公司工作
洛阳共同富裕互联网科技有限公司
工业互联网等科技实现智能化赋能
国大互联网教育科技有限公司薪资
10位科技互联网大佬
互联网科技快速发展优美句子
颐高云石互联网科技
互联网科技公司
万易互联网科技
智网互联网科技
上海卓越科技 互联网
宁夏科技产业互联网案例
新兴科技互联网创新大赛颁奖典礼
互联网科技包装股
中国科技和美国互联网
互联网金融金融科技
上海互联网科技园景观