Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 386|回复: 0

[Swing学习]JAVA截屏程序

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-3 23:55:41 | 显示全部楼层 |阅读模式
    1. /*
    2. * CaptureScreen.java
    3. *
    4. * Created on 2007年8月30日, 下午12:46
    5. *
    6. * To change this template, choose Tools | Template Manager
    7. * and open the template in the editor.
    8. */
    9. /**
    10. *
    11. * @author lbf
    12. */
    13. import java.awt.*;
    14. import java.awt.event.*;
    15. import javax.swing.*;
    16. import java.io.*;
    17. import javax.imageio.*;
    18. import java.awt.image.*;
    19. public class CaptureScreen extends JFrame implements ActionListener{
    20.     private JButton start,cancel,save;
    21.     private JPanel c;
    22.     private BufferedImage get;
    23.     /** Creates a new instance of CaptureScreen */
    24.     public CaptureScreen() {
    25.         super("屏幕截取软件(第二版)");
    26.         initWindow();
    27.     }
    28.     private void initWindow(){
    29.         start=new JButton("开始截取");
    30.         cancel=new JButton("退出");
    31.         save=new JButton("保存");
    32.         save.setEnabled(false);
    33.         save.addActionListener(this);
    34.         start.addActionListener(this);
    35.         cancel.addActionListener(this);
    36.         JPanel buttonJP=new JPanel();
    37.         c=new JPanel(new BorderLayout());
    38.         JLabel jl=new JLabel("屏幕截取",JLabel.CENTER);
    39.         JLabel jl1=new JLabel("作者:千里冰封",JLabel.CENTER);
    40.         jl.setFont(new Font("黑体",Font.BOLD,40));
    41.         jl1.setFont(new Font("宋体",Font.BOLD,20));
    42.         jl.setForeground(Color.RED);
    43.         jl1.setForeground(Color.BLUE);
    44.         c.add(jl,BorderLayout.CENTER);
    45.         c.add(jl1,BorderLayout.SOUTH);
    46.         buttonJP.add(start);
    47.         buttonJP.add(save);
    48.         buttonJP.add(cancel);
    49.         this.getContentPane().add(c,BorderLayout.CENTER);
    50.         this.getContentPane().add(buttonJP,BorderLayout.SOUTH);
    51.         this.setSize(300,300);
    52.         this.setLocationRelativeTo(null);
    53.         this.setVisible(true);
    54.         this.setAlwaysOnTop(true);
    55.         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    56.     }
    57.     private void updates(){
    58.         this.setVisible(true);
    59.         if(get!=null){
    60.             save.setEnabled(true);
    61.             ImageIcon ii=new ImageIcon(get);
    62.             JLabel jl=new JLabel(ii);
    63.             c.removeAll();
    64.             c.add(new JScrollPane(jl),BorderLayout.CENTER);
    65.             SwingUtilities.updateComponentTreeUI(this);
    66.         }
    67.     }
    68.     private void doStart(){
    69.         try{
    70.             this.setVisible(false);
    71.             Thread.sleep(500);//睡500毫秒是为了让主窗完全不见
    72.             Robot ro=new Robot();
    73.             Toolkit tk=Toolkit.getDefaultToolkit();
    74.             Dimension di=tk.getScreenSize();
    75.             Rectangle rec=new Rectangle(0,0,di.width,di.height);
    76.             BufferedImage bi=ro.createScreenCapture(rec);
    77.             JFrame jf=new JFrame();
    78.             Temp temp=new Temp(jf,bi,di.width,di.height);
    79.             jf.getContentPane().add(temp,BorderLayout.CENTER);
    80.             jf.setUndecorated(true);
    81.             jf.setSize(di);
    82.             jf.setVisible(true);
    83.             jf.setAlwaysOnTop(true);
    84.         } catch(Exception exe){
    85.             exe.printStackTrace();
    86.         }
    87.     }
    88.     private void doSave(){
    89.         try{
    90.             JFileChooser jfc=new JFileChooser(".");
    91.             jfc.addChoosableFileFilter(new JPGfilter());
    92.             jfc.addChoosableFileFilter(new PNGfilter());
    93.             jfc.addChoosableFileFilter(new GIFfilter());
    94.             jfc.addChoosableFileFilter(new BMPfilter());
    95.             int i=jfc.showSaveDialog(this);
    96.             if(i==JFileChooser.APPROVE_OPTION){
    97.                 File file=jfc.getSelectedFile();
    98.                 String about="PNG";
    99.                 String ext=file.toString().toLowerCase();
    100.                 javax.swing.filechooser.FileFilter ff=jfc.getFileFilter();
    101.                 if(ff instanceof JPGfilter){
    102.                     if(!ext.endsWith(".jpg")){
    103.                         String ns=ext+".jpg";
    104.                         file=new File(ns);
    105.                         about="JPG";
    106.                     }
    107.                 } else if(ff instanceof PNGfilter){
    108.                     if(!ext.endsWith(".png")){
    109.                         String ns=ext+".png";
    110.                         file=new File(ns);
    111.                         about="PNG";
    112.                     }
    113.                 }else if(ff instanceof BMPfilter){
    114.                     if(!ext.endsWith(".bmp")){
    115.                         String ns=ext+".bmp";
    116.                         file=new File(ns);
    117.                         about="BMP";
    118.                     }
    119.                 }else if(ff instanceof GIFfilter){
    120.                     if(!ext.endsWith(".gif")){
    121.                         String ns=ext+".gif";
    122.                         file=new File(ns);
    123.                         about="GIF";
    124.                     }
    125.                 }
    126.                 if(ImageIO.write(get,about,file)){
    127.                     JOptionPane.showMessageDialog(this,"保存成功!");
    128.                 } else
    129.                     JOptionPane.showMessageDialog(this,"保存失败!");
    130.             }
    131.         } catch(Exception exe){
    132.             exe.printStackTrace();
    133.         }
    134.     }
    135.     public void actionPerformed(ActionEvent ae){
    136.         if(ae.getSource()==start){
    137.             doStart();
    138.         } else if(ae.getSource()==cancel){
    139.             System.exit(0);
    140.         } else if(ae.getSource()==save){
    141.             doSave();
    142.         }
    143.     }
    144.     //保存BMP格式的过滤器
    145.     private class BMPfilter extends javax.swing.filechooser.FileFilter{
    146.         public BMPfilter(){
    147.             
    148.         }
    149.         public boolean accept(File file){
    150.             if(file.toString().toLowerCase().endsWith(".bmp")||
    151.                     file.isDirectory()){
    152.                 return true;
    153.             } else
    154.                 return false;
    155.         }
    156.         public String getDescription(){
    157.             return "*.BMP(BMP图像)";
    158.         }
    159.     }
    160.     //保存JPG格式的过滤器
    161.     private class JPGfilter extends javax.swing.filechooser.FileFilter{
    162.         public JPGfilter(){
    163.             
    164.         }
    165.         public boolean accept(File file){
    166.             if(file.toString().toLowerCase().endsWith(".jpg")||
    167.                     file.toString().toLowerCase().endsWith(".jpeg")||
    168.                     file.isDirectory()){
    169.                 return true;
    170.             } else
    171.                 return false;
    172.         }
    173.         public String getDescription(){
    174.             return "*.JPG,*.JPEG(JPG,JPEG图像)";
    175.         }
    176.     }
    177.     //保存GIF格式的过滤器
    178.     private class GIFfilter extends javax.swing.filechooser.FileFilter{
    179.         public GIFfilter(){
    180.             
    181.         }
    182.         public boolean accept(File file){
    183.             if(file.toString().toLowerCase().endsWith(".gif")||
    184.                     file.isDirectory()){
    185.                 return true;
    186.             } else
    187.                 return false;
    188.         }
    189.         public String getDescription(){
    190.             return "*.GIF(GIF图像)";
    191.         }
    192.     }
    193.    
    194.     //保存PNG格式的过滤器
    195.     private class PNGfilter extends javax.swing.filechooser.FileFilter{
    196.         public boolean accept(File file){
    197.             if(file.toString().toLowerCase().endsWith(".png")||
    198.                     file.isDirectory()){
    199.                 return true;
    200.             } else
    201.                 return false;
    202.         }
    203.         public String getDescription(){
    204.             return "*.PNG(PNG图像)";
    205.         }
    206.     }
    207.     //一个暂时类,用于显示当前的屏幕图像
    208.     private class Temp extends JPanel implements MouseListener,MouseMotionListener{
    209.         private BufferedImage bi;
    210.         private int width,height;
    211.         private int startX,startY,endX,endY,tempX,tempY;
    212.         private JFrame jf;
    213.         private Rectangle select=new Rectangle(0,0,0,0);//表示选中的区域
    214.         private Cursor cs=new Cursor(Cursor.CROSSHAIR_CURSOR);//表示一般情况下的鼠标状态
    215.         private States current=States.DEFAULT;// 表示当前的编辑状态
    216.         private Rectangle[] rec;//表示八个编辑点的区域
    217.         //下面四个常量,分别表示谁是被选中的那条线上的端点
    218.         public static final int START_X=1;
    219.         public static final int START_Y=2;
    220.         public static final int END_X=3;
    221.         public static final int END_Y=4;
    222.         private int currentX,currentY;//当前被选中的X和Y,只有这两个需要改变
    223.         private Point p=new Point();//当前鼠标移的地点
    224.         private boolean showTip=true;//是否显示提示.如果鼠标左键一按,则提示不再显了
    225.         public Temp(JFrame jf,BufferedImage bi,int width,int height){
    226.             this.jf=jf;
    227.             this.bi=bi;
    228.             this.width=width;
    229.             this.height=height;
    230.             this.addMouseListener(this);
    231.             this.addMouseMotionListener(this);
    232.             initRecs();
    233.         }
    234.         private void initRecs(){
    235.             rec=new Rectangle[8];
    236.             for(int i=0;i< rec.length;i++){
    237.                 rec[i]=new Rectangle();
    238.             }
    239.         }
    240.         public void paintComponent(Graphics g){
    241.             g.drawImage(bi,0,0,width,height,this);
    242.             g.setColor(Color.RED);
    243.             g.drawLine(startX,startY,endX,startY);
    244.             g.drawLine(startX,endY,endX,endY);
    245.             g.drawLine(startX,startY,startX,endY);
    246.             g.drawLine(endX,startY,endX,endY);
    247.             int x=startX< endX?startX:endX;
    248.             int y=startY< endY?startY:endY;
    249.             select=new Rectangle(x,y,Math.abs(endX-startX),Math.abs(endY-startY));
    250.             int x1=(startX+endX)/2;
    251.             int y1=(startY+endY)/2;
    252.             g.fillRect(x1-2,startY-2,5,5);
    253.             g.fillRect(x1-2,endY-2,5,5);
    254.             g.fillRect(startX-2,y1-2,5,5);
    255.             g.fillRect(endX-2,y1-2,5,5);
    256.             g.fillRect(startX-2,startY-2,5,5);
    257.             g.fillRect(startX-2,endY-2,5,5);
    258.             g.fillRect(endX-2,startY-2,5,5);
    259.             g.fillRect(endX-2,endY-2,5,5);
    260.             rec[0]=new Rectangle(x-5,y-5,10,10);
    261.             rec[1]=new Rectangle(x1-5,y-5,10,10);
    262.             rec[2]=new Rectangle((startX>endX?startX:endX)-5,y-5,10,10);
    263.             rec[3]=new Rectangle((startX>endX?startX:endX)-5,y1-5,10,10);
    264.             rec[4]=new Rectangle((startX>endX?startX:endX)-5,(startY>endY?startY:endY)-5,10,10);
    265.             rec[5]=new Rectangle(x1-5,(startY>endY?startY:endY)-5,10,10);
    266.             rec[6]=new Rectangle(x-5,(startY>endY?startY:endY)-5,10,10);
    267.             rec[7]=new Rectangle(x-5,y1-5,10,10);
    268.             if(showTip){
    269.                 g.setColor(Color.CYAN);
    270.                 g.fillRect(p.x,p.y,170,20);
    271.                 g.setColor(Color.RED);
    272.                 g.drawRect(p.x,p.y,170,20);
    273.                 g.setColor(Color.BLACK);
    274.                 g.drawString("请按住鼠标左键不放选择截图区",p.x,p.y+15);
    275.             }
    276.         }
    277.         //根据东南西北等八个方向决定选中的要修改的X和Y的座标
    278.         private void initSelect(States state){
    279.             switch(state){
    280.                 case DEFAULT:
    281.                     currentX=0;
    282.                     currentY=0;
    283.                     break;
    284.                 case EAST:
    285.                     currentX=(endX>startX?END_X:START_X);
    286.                     currentY=0;
    287.                     break;
    288.                 case WEST:
    289.                     currentX=(endX>startX?START_X:END_X);
    290.                     currentY=0;
    291.                     break;
    292.                 case NORTH:
    293.                     currentX=0;
    294.                     currentY=(startY>endY?END_Y:START_Y);
    295.                     break;
    296.                 case SOUTH:
    297.                     currentX=0;
    298.                     currentY=(startY>endY?START_Y:END_Y);
    299.                     break;
    300.                 case NORTH_EAST:
    301.                     currentY=(startY>endY?END_Y:START_Y);
    302.                     currentX=(endX>startX?END_X:START_X);
    303.                     break;
    304.                 case NORTH_WEST:
    305.                     currentY=(startY>endY?END_Y:START_Y);
    306.                     currentX=(endX>startX?START_X:END_X);
    307.                     break;
    308.                 case SOUTH_EAST:
    309.                     currentY=(startY>endY?START_Y:END_Y);
    310.                     currentX=(endX>startX?END_X:START_X);
    311.                     break;
    312.                 case SOUTH_WEST:
    313.                     currentY=(startY>endY?START_Y:END_Y);
    314.                     currentX=(endX>startX?START_X:END_X);
    315.                     break;
    316.                 default:
    317.                     currentX=0;
    318.                     currentY=0;
    319.                     break;
    320.             }
    321.         }
    322.         public void mouseMoved(MouseEvent me){
    323.             doMouseMoved(me);
    324.             initSelect(current);
    325.             if(showTip){
    326.                 p=me.getPoint();
    327.                 repaint();
    328.             }
    329.         }
    330.         //特意定义一个方法处理鼠标移动,是为了每次都能初始化一下所要选择的地区
    331.         private void doMouseMoved(MouseEvent me){
    332.             if(select.contains(me.getPoint())){
    333.                 this.setCursor(new Cursor(Cursor.MOVE_CURSOR));
    334.                 current=States.MOVE;
    335.             } else{
    336.                 States[] st=States.values();
    337.                 for(int i=0;i< rec.length;i++){
    338.                     if(rec[i].contains(me.getPoint())){
    339.                         current=st[i];
    340.                         this.setCursor(st[i].getCursor());
    341.                         return;
    342.                     }
    343.                 }
    344.                 this.setCursor(cs);
    345.                 current=States.DEFAULT;
    346.             }
    347.         }
    348.         public void mouseExited(MouseEvent me){
    349.             
    350.         }
    351.         public void mouseEntered(MouseEvent me){
    352.             
    353.         }
    354.         public void mouseDragged(MouseEvent me){
    355.             int x=me.getX();
    356.             int y=me.getY();
    357.             if(current==States.MOVE){
    358.                 startX+=(x-tempX);
    359.                 startY+=(y-tempY);
    360.                 endX+=(x-tempX);
    361.                 endY+=(y-tempY);
    362.                 tempX=x;
    363.                 tempY=y;
    364.             }else if(current==States.EAST||current==States.WEST){
    365.                 if(currentX==START_X){
    366.                     startX+=(x-tempX);
    367.                     tempX=x;
    368.                 }else{
    369.                     endX+=(x-tempX);
    370.                     tempX=x;
    371.                 }
    372.             }else if(current==States.NORTH||current==States.SOUTH){
    373.                 if(currentY==START_Y){
    374.                     startY+=(y-tempY);
    375.                     tempY=y;
    376.                 }else{
    377.                     endY+=(y-tempY);
    378.                     tempY=y;
    379.                 }
    380.             }else if(current==States.NORTH_EAST||current==States.NORTH_EAST||
    381.                     current==States.SOUTH_EAST||current==States.SOUTH_WEST){
    382.                 if(currentY==START_Y){
    383.                     startY+=(y-tempY);
    384.                     tempY=y;
    385.                 }else{
    386.                     endY+=(y-tempY);
    387.                     tempY=y;
    388.                 }
    389.                 if(currentX==START_X){
    390.                     startX+=(x-tempX);
    391.                     tempX=x;
    392.                 }else{
    393.                     endX+=(x-tempX);
    394.                     tempX=x;
    395.                 }
    396.                
    397.             }else{
    398.                 startX=tempX;
    399.                 startY=tempY;
    400.                 endX=me.getX();
    401.                 endY=me.getY();
    402.             }
    403.             this.repaint();
    404.         }
    405.         public void mousePressed(MouseEvent me){
    406.             showTip=false;
    407.             tempX=me.getX();
    408.             tempY=me.getY();
    409.         }
    410.         public void mouseReleased(MouseEvent me){
    411.             if(me.isPopupTrigger()){
    412.                 if(current==States.MOVE){
    413.                     showTip=true;
    414.                     p=me.getPoint();
    415.                     startX=0;
    416.                     startY=0;
    417.                     endX=0;
    418.                     endY=0;
    419.                     repaint();
    420.                 } else{
    421.                     jf.dispose();
    422.                     updates();
    423.                 }
    424.                
    425.             }
    426.         }
    427.         public void mouseClicked(MouseEvent me){
    428.             if(me.getClickCount()==2){
    429.                 //Rectangle rec=new Rectangle(startX,startY,Math.abs(endX-startX),Math.abs(endY-startY));
    430.                 Point p=me.getPoint();
    431.                 if(select.contains(p)){
    432.                     if(select.x+select.width< this.getWidth()&&select.y+select.height< this.getHeight()){
    433.                         get=bi.getSubimage(select.x,select.y,select.width,select.height);
    434.                         jf.dispose();
    435.                         save.setEnabled(true);
    436.                         updates();
    437.                     }else{
    438.                         int wid=select.width,het=select.height;
    439.                         if(select.x+select.width>=this.getWidth()){
    440.                             wid=this.getWidth()-select.x;
    441.                         }
    442.                         if(select.y+select.height>=this.getHeight()){
    443.                             het=this.getHeight()-select.y;
    444.                         }
    445.                         get=bi.getSubimage(select.x,select.y,wid,het);
    446.                         jf.dispose();
    447.                         save.setEnabled(true);
    448.                         updates();
    449.                     }
    450.                     
    451.                 }
    452.             }
    453.         }
    454.     }
    455.    
    456.     public static void main(String args[]){
    457.         new CaptureScreen();
    458.     }
    459. }
    460. enum States{
    461.     NORTH_WEST(new Cursor(Cursor.NW_RESIZE_CURSOR)),//表示西北角
    462.     NORTH(new Cursor(Cursor.N_RESIZE_CURSOR)),
    463.     NORTH_EAST(new Cursor(Cursor.NE_RESIZE_CURSOR)),
    464.     EAST(new Cursor(Cursor.E_RESIZE_CURSOR)),
    465.     SOUTH_EAST(new Cursor(Cursor.SE_RESIZE_CURSOR)),
    466.     SOUTH(new Cursor(Cursor.S_RESIZE_CURSOR)),
    467.     SOUTH_WEST(new Cursor(Cursor.SW_RESIZE_CURSOR)),
    468.     WEST(new Cursor(Cursor.W_RESIZE_CURSOR)),
    469.     MOVE(new Cursor(Cursor.MOVE_CURSOR)),
    470.     DEFAULT(new Cursor(Cursor.DEFAULT_CURSOR));
    471.     private Cursor cs;
    472.     States(Cursor cs){
    473.         this.cs=cs;
    474.     }
    475.     public Cursor getCursor(){
    476.         return cs;
    477.     }
    478. }
    复制代码
    效果图:

      
       
         
         
          
          

            
          

            
          
         
       

      


    源码下载:http://file.javaxxz.com/2014/11/3/235541343.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2026-6-19 13:15 , Processed in 0.895808 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表