`
lbfhappy
  • 浏览: 83202 次
社区版块
存档分类
最新评论

JAVA截屏程序(第四版)

阅读更多
昨天看到留言,于是今天又把一些功能加进进去了

比如,
1,程序可以最小化到系统托盘区
2,程序可以批量保存所有截过的图片
3,修正了以前的一个小BUG,那就是输入保存图片的文件名时,如果没有输入后缀名,将保存正常,如果输入了后缀名,将会保存格式出错
打包文件请点击这里下载,dist文件夹里面的JAR文件是可以双击执行的

感谢朋友们的建议,谢谢.

/*
 * CaptureScreen.java
 *
 * Created on 2007年8月30日, 下午12:46
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 
*/

package hadeslee.swing;

/**
 *
 * 
@author lbf
 
*/
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,saveAll;
    
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();
        initTrayIcon();
    }
    
private void initOther(){
        jtp
=new JTabbedPane(JTabbedPane.TOP,JTabbedPane.SCROLL_TAB_LAYOUT);
    }
    
private void initWindow(){
        start
=new JButton("开始截取");
        saveAll
=new JButton("保存所有");
        cancel
=new JButton("退出");
        start.addActionListener(
this);
        saveAll.addActionListener(
this);
        cancel.addActionListener(
this);
        JPanel buttonJP
=new JPanel();
        c
=new JPanel(new BorderLayout());
        c.setBackground(Color.BLACK);
        JLabel jl
=new JLabel("屏幕截取",JLabel.CENTER);
        JLabel jl1
=new JLabel("<Html><Font size=5 color=white>作者:千里冰封<br>" +
                
"QQ:24325142<br><br><br></Font></html>",JLabel.CENTER);
        jl.setFont(
new Font("黑体",Font.BOLD,40));
        jl.setForeground(Color.RED);
        jl1.setForeground(Color.BLUE);
        c.add(jl,BorderLayout.CENTER);
        c.add(jl1,BorderLayout.SOUTH);
        buttonJP.add(start);
        buttonJP.add(saveAll);
        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.DO_NOTHING_ON_CLOSE);
        
this.addWindowListener(new WindowAdapter(){
            
public void windowClosing(WindowEvent we){
                CaptureScreen.
this.setVisible(false);
            }
        });
    }
    
private void initTrayIcon(){
        
try{
            SystemTray st
=SystemTray.getSystemTray();
            Image im
=ImageIO.read(this.getClass().getResource("bg.gif"));
            PopupMenu pm
=new PopupMenu("弹出菜单");
            pm.add(
new MenuItem("关于")).addActionListener(new ActionListener(){
                
public void actionPerformed(ActionEvent ae){
                    JOptionPane.showMessageDialog(CaptureScreen.
this,"<html><Font color=red><center><h2>关于</h2></center></Font>" +
                            
"这是一款纯JAVA的屏幕截取程序<br>在以前的基础上增加了一些常用的功能,<br>" +
                            
"比如,批量保存,多幅截取,复制到系统粘帖板<br>" +
                            
"在使用过程中有任何问题,欢迎联系.<br>" +
                            
"<Font size=5 color=blue>作者:千里冰封<br>" +
                            
"<i>QQ:24325142</i><br></Font></html>");
                }
            });
            pm.addSeparator();
            pm.add(
new MenuItem("显示主窗口")).addActionListener(new ActionListener(){
                
public void actionPerformed(ActionEvent ae){
                    CaptureScreen.
this.setVisible(true);
                }
            });
            pm.add(
new MenuItem("开始截取")).addActionListener(new ActionListener(){
                
public void actionPerformed(ActionEvent ae){
                    doStart();
                }
            });
            pm.add(
new MenuItem("退出程序")).addActionListener(new ActionListener(){
                
public void actionPerformed(ActionEvent ae){
                    System.exit(
0);
                }
            });
            TrayIcon ti
=new TrayIcon(im,"JAVA屏幕截取",pm);
            st.add(ti);
            ti.addActionListener(
new ActionListener(){
                
public void actionPerformed(ActionEvent ae){
                    CaptureScreen.
this.setVisible(true);
                }
            });
        }
catch(Exception exe){
            exe.printStackTrace();
        }
    }
    
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);
        }
    }
    
private void doStart(){
        
try{
            
this.setVisible(false);
            Thread.sleep(
500);//睡500毫秒是为了让主窗完全不见
            Robot ro=new Robot();
            Toolkit tk
=Toolkit.getDefaultToolkit();
            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);
            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 doSaveAll(){
        
if(jtp.getTabCount()==0){
            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){
                about
="JPG";
            } 
else if(ff instanceof PNGfilter){
                about
="PNG";
            }
else if(ff instanceof BMPfilter){
                about
="BMP";
            }
else if(ff instanceof GIFfilter){
                about
="GIF";
            }
            
if(ext.endsWith(about.toLowerCase())){
                ext
=ext.substring(0,ext.lastIndexOf(about.toLowerCase()));
            }
            
//起一个线程去保存这些图片并显示出进度条
            new SaveAllThread(ext,about).setVisible(true);
        }
        
    }
    
//专门用来保存所有图片的线程类,它还要显示出保存的进度条
    private class SaveAllThread extends JDialog implements Runnable{
        
private String name;//文件名头部份
        private String ext;//文件格式
        private JProgressBar jpb;//一个进度条
        private JLabel info;// 一个信息显示条
        private int allTask,doneTask;//所有任务,已完成任务
        public SaveAllThread(String name,String ext){
            
super(CaptureScreen.this,"保存",true);
            
this.name=name;
            
this.ext=ext;
            initWindow();
        }
        
private void initWindow(){
            jpb
=new JProgressBar();
            allTask
=jtp.getTabCount();
            jpb.setMaximum(allTask);
            jpb.setMinimum(
0);
            jpb.setValue(
0);
            jpb.setStringPainted(
true);
            setProgressBarString();
            info
=new JLabel("正在保存到:");
            
this.getContentPane().setBackground(Color.CYAN);
            
this.add(info,BorderLayout.NORTH);
            
this.add(jpb,BorderLayout.SOUTH);
            
this.setUndecorated(true);
            
this.setSize(300,100);
            
this.setLocationRelativeTo(CaptureScreen.this);
            
new Thread(this).start();
        }
        
private void setProgressBarString(){
            jpb.setString(
""+doneTask+"/"+allTask);
        }
        
public void run(){
            
try{
                
for(int i=0;i<allTask;i++){
                    PicPanel pp
=(PicPanel)jtp.getComponentAt(i);
                    BufferedImage image
=pp.getImage();
                    File f
= new File(name+(doneTask+1)+"."+ext.toLowerCase());
                    info.setText(
"<html><b>正在保存到:</b><br>"+f.toString()+"</html>");
                    ImageIO.write(image,ext,f);
                    doneTask
++;
                    jpb.setValue(doneTask);
                    setProgressBarString();
                    Thread.sleep(
500);
                }
                JOptionPane.showMessageDialog(
this,"保存完毕!!");
                
this.dispose();
            }
catch(Exception exe){
                exe.printStackTrace();
                
this.dispose();
            }
        }
    }
    
/**
     *公用的处理保存图片的方法
     *这个方法不再私有了
     
*/
    
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){
                    about
="JPG";
                    
if(!ext.endsWith(".jpg")){
                        String ns
=ext+".jpg";
                        file
=new File(ns);
                    }
                } 
else if(ff instanceof PNGfilter){
                    about
="PNG";
                    
if(!ext.endsWith(".png")){
                        String ns
=ext+".png";
                        file
=new File(ns);
                        
                    }
                }
else if(ff instanceof BMPfilter){
                    about
="BMP";
                    
if(!ext.endsWith(".bmp")){
                        String ns
=ext+".bmp";
                        file
=new File(ns);
                        
                &n
分享到:
评论
5 楼 venus224 2010-04-09  
感谢你!
是你让我进入了开发这个行业!
4 楼 wendal 2010-03-10  
不错嘛, 正好可以用上.
3 楼 keling 2009-09-05  
第三、四版附件资源均找不到啦,可否也email一份给我学习下呀?
kl_d@hotmail.com
谢谢
2 楼 leagion 2009-07-12  
第三、四版附件资源均找不到啦,可否也email一份给我学习下呀?

leagion@qq.com

谢谢。
1 楼 java_laq 2009-02-05  
附件资源找不到啦,可否email一份给我学习下呀


java_laq@163.com

多谢.

相关推荐

    java程序设计报告模板

    第四部分:心得体会 - **学习体会**:分享在项目开发过程中的收获和感悟。 - **改进建议**:提出项目中存在的不足之处及改进建议。 - **未来展望**:对个人或项目未来发展方向的看法。 #### 三、编写建议 - **...

    java源码包---java 源码 大量 实例

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...

    JSP程序设计技术教程 第四章项目实训源代码及截图

    在本资源中,我们主要探讨的是JSP(JavaServer Pages)程序设计技术,特别是通过一个实际项目的第四章实训来深入理解这一技术。JSP是一种基于Java的服务器端脚本语言,用于生成动态网页内容。本教程的核心是通过实践...

    JAVA程序设计实验报告

    本实验报告是针对大学生JAVA程序设计课程的,基于吕凤翥第二版教材,旨在通过实际操作加深对JAVA语言的理解,特别是GUI(图形用户界面)菜单设计方面的能力培养。实验的主要目标是让学生掌握菜单设计、弹出菜单设计...

    java下载(含截图)

    - Java SE (Standard Edition) 是用于开发桌面应用程序的标准版 Java 平台。 - 选择正确的 Java 版本对于后续的开发工作至关重要。 3. **关键知识点**: - **Java SE**: 主要用于开发桌面应用,包含了基本的 ...

    JAVA上百实例源码以及开源项目源代码

    Java编写的山寨QQ,多人聊天+用户在线 21个目标文件 摘要:JAVA源码,媒体网络,山寨QQ,Java聊天程序 Java编写的山寨QQ,多人聊天+用户在线,程序分服务端和客户端,典型C/S结构, 当用户发送第一次请求的时候,验证...

    java SE第1次实验报告要求

    3. 时间安排上,你需要在第6周的星期四(4月3日)提交报告。这意味着你需要提前规划好时间,确保有足够的时间完成实验、调试代码和撰写报告。 在撰写报告时,可以按照以下结构进行: - 引言:简单介绍实验的目标和...

    【藏宝图】(珍藏版)2012java开发工程师必备精品资料(115)

    #### 三十一、Java大学教程(JavaHowtoProgram)(第四版)中文版 这本书详细介绍了Java编程的基本概念和技术,适合大学阶段的Java课程教学。 #### 三十二、Java+Eclipse实战视频教程第一集 这份教程通过10集的视频...

    Java课程设计任务书

    5. 如果设计题目来源于《Java课程设计案例精编(第二版)》,则需要在此基础上增加1-2项新功能。 课程设计报告应包含以下部分: 1. 封面 2. 目录 3. 系统描述:介绍系统的功能和解决的问题 4. 分析与设计:功能模块...

    java工程的创建简单易懂,截图教程

    - **第四步:** 在`WEB-INF`目录下新建`web.xml`文件。该文件用于定义Web应用的基本配置信息。文件的内容如下: ```xml &lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi=...

    从零开始搭建SpringCloud第三节源码及截图

    在本节中,我们将深入探讨如何从零开始搭建SpringCloud项目,并通过源码分析和相关截图来理解这一过程。SpringCloud作为一个微服务框架,提供了一系列工具和服务,帮助开发者快速构建分布式系统。它包括服务发现、...

    编译原理实验四-语义分析

    实验结果以截图的形式展示,可以直观地看到输入表达式经过语义分析后的四元式序列,从而验证程序的正确性。 在“src”目录下,包含了实验的主要源代码,这些代码实现了递归下降分析器的各种函数,对应于文法的不同...

    JAVA学习笔记-java学习笔记WORD样式.docx

    #### 八、第一个Java程序:HelloWorld ```java class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } } ``` 1. **程序结构**: - 定义类:`class HelloWorld`...

    java课程设计完成稿.docx

    《Java2实用教程(第三版)》北京清华大学出版社2006.8 - [2] 朱福喜.《Java语言程序设计》.北京清华大学出版社.2005 - [3] 朱福喜,尹为民,余振坤.《Java语言与面向对象程序设计》.武汉武汉大学出版社.2002 ...

    编译原理实验报告+语法分析代码(C语言)

    词法分析是编译器的第一个阶段,它的任务是识别源代码中的关键字、标识符、常量、运算符等基本元素。在这个实验中,词法分析器可能通过扫描输入的字符流,根据预定义的正则表达式来识别不同的标记。每个识别出的标记...

    java课程设计之学生信息管理系统源码.zip

    2. 正确导入项目后我们来看下包结构:分为Dao、model、view、util四个顶层包,采用的是mvc的设计模式。 3. 第二部需要导入数据库,我们用的是navicat数据库管理软件,非常好用,建议大家也使用这个。 4. 首先先新建...

    JSP实用教程案例及素材

    《JSP实用教程案例及素材》是一本专为学习Java Server Pages(JSP)技术而设计的实践指导书籍。该书以丰富的实例为载体,帮助读者深入理解和掌握JSP的基本概念、语法特性以及在实际开发中的应用。通过本书,读者可以...

    Java swing实现学生信息管理系统源码+文档

    这款Java swing实现的学生信息管理系统和jsp版本的功能很相似,简单的实现了班级信息的增删改查,学生信息的增删改查,数据库采用的是mysql,jdk版本不限,是Java学习者学习参考非常好的一个小项目,下面我们来看看...

Global site tag (gtag.js) - Google Analytics