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

JAVA截屏程序(第三版)

阅读更多
呵呵,昨天也看到朋友的留言,又增加了一些功能,

1,增加了一个把截到的图片复制到系统的剪帖板,这样一来就可以直接粘帖到word,photoshop,画图等程序里面了

2,增加了每截一张图片都会新开一个tab来放它,并且tab里面各自有各自的操作方法.

点击下载源文件和可执行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;
    
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);
        JLabel jl1
=new JLabel("作者:千里冰封",JLabel.CENTER);
        jl.setFont(
new Font("黑体",Font.BOLD,40));
        jl1.setFont(
new Font("宋体",Font.BOLD,20));
        jl.setForeground(Color.RED);
        jl1.setForeground(Color.BLUE);
        c.add(jl,BorderLayout.CENTER);
        c.add(jl1,BorderLayout.SOUTH);
        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);
        }
    }
    
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 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;
            }
            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()){
                
分享到:
评论

相关推荐

    java语言程序设计第十版答案及图片资源

    《Java语言程序设计第十版》是一本广泛应用于教学和自学的Java编程教材,其第十版在原有的基础上进行了更新和改进,以适应不断发展的Java技术和编程环境。本资源包含该书的课后习题答案及相关的图片资源,为学习者...

    java程序设计报告模板

    第三部分:自己承担部分的实验报告 - **实验目的**:明确实验的目的和意义。 - **实验环境**:列出实验所需的软硬件环境配置。 - **实验步骤**:详细记录实验的操作步骤。 - **实验结果**:展示实验的结果,包括...

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

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

    JAVA HTML截图.rar

    1. 加载HTML:可以使用Java的内置`javax.swing.JEditorPane`或第三方库如JSoup来加载和解析HTML内容。 2. 创建一个透明的Swing组件,例如`JPanel`,并将解析后的HTML渲染到这个组件上。 3. 使用DJNativeSwing库将...

    java版本的网页截图实例

    通常,这需要借助第三方库,如Selenium WebDriver,它可以控制浏览器并获取网页的渲染视图。Selenium支持多种浏览器,如Chrome、Firefox等,通过WebDriver API可以模拟用户交互,获取页面的HTML源码,甚至进行页面...

    java 拍照 截取图片

    综上所述,实现“java 拍照 截取图片”功能涉及了Java Web开发、多媒体处理、图像处理、设备访问等多个方面,需要结合Java标准库、第三方库以及Web技术来综合实现。在实际开发中,需要根据具体需求选择合适的技术栈...

    截图/粘贴剪切版图片并自动上传Java版(Servlet/Spring)

    "截图"通常涉及到操作系统级别的功能,例如Windows或macOS中的快捷键操作,或者第三方截图工具如QQ截图。这些截图会被保存到系统的剪切板中,可以随时被复制或粘贴。 "粘贴剪切版图片"是指将剪切板中的图片数据直接...

    软件测试 第三版

    ### 软件测试第三版知识点总结 #### 一、软件测试概述 - **定义**:软件测试是为了发现错误而执行程序的过程。它是一种实际输出与预期输出之间的比较。 - **目的**:验证软件产品的质量,确保其符合需求规格说明书...

    java源码包3

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

    java源码包2

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

    java实现网页截图含DJNativeSwing组件JAR包

    DJNativeSwing是一个开源库,它提供了Java Swing与原生操作系统(如Windows、Mac OS等)的深度集成,使得Java程序能够更好地利用操作系统特性,比如在本例中,它可以用于实现屏幕截图功能。 DJNativeSwing库主要...

    JAVA程序设计实验报告

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

    java下载(含截图)

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

    android截屏程序项目工程

    在Android应用中,需要使用第三方库如Superuser或BusyBox,这些库提供了与系统shell交互的能力,以执行需要root权限的操作。 5. **编码实现** - 在Eclipse中,你需要创建一个新的Android项目,然后在主活动中编写...

    一个完整的android framebuffer截图程序 加强版

    这通常涉及使用Java的ImageIO类或者第三方库如libpng。 在“加强版”程序中,新增了对屏幕指定部位截图的功能。这通常意味着程序需要额外处理用户输入的坐标,只读取屏幕指定区域的Framebuffer数据。这可能涉及计算...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

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

    java源码包4

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

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

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

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

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

Global site tag (gtag.js) - Google Analytics