JAVA实现的截屏程序

http://hadeslee.iteye.com/blog/125386

http://www.jb51.net/article/75114.htm

JAVA截屏程序(第三版)

JavaEXTSwingCC++

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

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

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

点击下载源文件和可执行JAR文件

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);

  jl.setFont(new Font("黑体",Font.BOLD,40));

  jl.setForeground(Color.RED);

  c.add(jl,BorderLayout.CENTER);

  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);

     }

    }else if(ff instanceof GIFfilter){

     about="GIF";

     if(!ext.endsWith(".gif")){

      String ns=ext+".gif";

      file=new File(ns);

     }

    }

    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();

   }

  }else if(source==saveAll){

   doSaveAll();

  }

 }

 //一个内部类,它表示一个面板,一个可以被放进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();

  }

  public BufferedImage getImage(){

   return get;

  }

  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;i<rec.length;i++){

    rec[i]=new Rectangle();

   }

  }

  public void paintComponent(Graphics g){

   g.drawImage(bi,0,0,width,height,this);

   g.setColor(Color.RED);

   g.drawLine(startX,startY,endX,startY);

   g.drawLine(startX,endY,endX,endY);

   g.drawLine(startX,startY,startX,endY);

   g.drawLine(endX,startY,endX,endY);

   int x=startX<endX?startX:endX;

   int y=startY<endY?startY:endY;

   select=new Rectangle(x,y,Math.abs(endX-startX),Math.abs(endY-startY));

   int x1=(startX+endX)/2;

   int y1=(startY+endY)/2;

   g.fillRect(x1-2,startY-2,5,5);

   g.fillRect(x1-2,endY-2,5,5);

   g.fillRect(startX-2,y1-2,5,5);

   g.fillRect(endX-2,y1-2,5,5);

   g.fillRect(startX-2,startY-2,5,5);

   g.fillRect(startX-2,endY-2,5,5);

   g.fillRect(endX-2,startY-2,5,5);

   g.fillRect(endX-2,endY-2,5,5);

   rec[0]=new Rectangle(x-5,y-5,10,10);

   rec[1]=new Rectangle(x1-5,y-5,10,10);

   rec[2]=new Rectangle((startX>endX?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);

   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<rec.length;i++){

     if(rec[i].contains(me.getPoint())){

      current=st[i];

      this.setCursor(st[i].getCursor());

      return;

     }

    }

    this.setCursor(cs);

    current=States.DEFAULT;

   }

  }

  public void mouseExited(MouseEvent me){

  }

  public void mouseEntered(MouseEvent me){

  }

  public void mouseDragged(MouseEvent me){

   int x=me.getX();

   int y=me.getY();

   if(current==States.MOVE){

    startX+=(x-tempX);

    startY+=(y-tempY);

    endX+=(x-tempX);

    endY+=(y-tempY);

    tempX=x;

    tempY=y;

   }else if(current==States.EAST||current==States.WEST){

    if(currentX==START_X){

     startX+=(x-tempX);

     tempX=x;

    }else{

     endX+=(x-tempX);

     tempX=x;

    }

   }else if(current==States.NORTH||current==States.SOUTH){

    if(currentY==START_Y){

     startY+=(y-tempY);

     tempY=y;

    }else{

     endY+=(y-tempY);

     tempY=y;

    }

   }else if(current==States.NORTH_EAST||current==States.NORTH_EAST||

     current==States.SOUTH_EAST||current==States.SOUTH_WEST){

    if(currentY==START_Y){

     startY+=(y-tempY);

     tempY=y;

    }else{

     endY+=(y-tempY);

     tempY=y;

    }

    if(currentX==START_X){

     startX+=(x-tempX);

     tempX=x;

    }else{

     endX+=(x-tempX);

     tempX=x;

    }

   }else{

    startX=tempX;

    startY=tempY;

    endX=me.getX();

    endY=me.getY();

   }

   this.repaint();

  }

  public void mousePressed(MouseEvent me){

   showTip=false;

   tempX=me.getX();

   tempY=me.getY();

  }

  public void mouseReleased(MouseEvent me){

   if(me.isPopupTrigger()){

    if(current==States.MOVE){

     showTip=true;

     p=me.getPoint();

     startX=0;

     startY=0;

     endX=0;

     endY=0;

     repaint();

    } else{

     jf.dispose();

     updates();

    }

   }

  }

  public void mouseClicked(MouseEvent me){

   if(me.getClickCount()==2){

    //Rectangle rec=new Rectangle(startX,startY,Math.abs(endX-startX),Math.abs(endY-startY));

    Point p=me.getPoint();

    if(select.contains(p)){

     if(select.x+select.width<this.getWidth()&&select.y+select.height<this.getHeight()){

      get=bi.getSubimage(select.x,select.y,select.width,select.height);

      jf.dispose();

      updates();

     }else{

      int wid=select.width,het=select.height;

      if(select.x+select.width>=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;

 }

}

时间: 2024-10-28 11:42:11

JAVA实现的截屏程序的相关文章

JAVA之网页截屏

之前我也写过JAVA实现截屏效果,用了两三种方法,发现还是现在的这种方法最简单.但是要注意的是此方法仅适用于JdK1.6及以上版本. import java.awt.AWTException; import java.awt.Desktop; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; import java.awt.Rectangle; import java.awt.Robot; im

一个基于Qt的截屏程序

最近有一个arm板上的程序需要重写用户手册,在网上找了许久,没找到合适的截屏工具.于是只好自己动手做一个了. 因为arm板上有已经有了Qt环境,于是想到用 Qt的QPixmap::grabWindow 直接抓屏即可. 部署到arm设备后用com连接设备,抓屏,一步OK!虽然简单,但给编写手册的小伙伴们使用足够了. 代码没几行,贴上全部代码了. #include <QApplication> #include <QPixmap> #include <QDesktopWidget

Java实现网页截屏功能(基于phantomJs)

公司最近有个需求:把用户第一次的测量身体信息和最近一次测量信息进行对比,并且需要把对比的数据截成图片可以发给用户(需要在不打开网页的情况下实时对网页进行截图然后保存到服务器上,返回图片地址),通过网上的一些文章可以发现有以下几种实现方式:参考文章https://blog.csdn.net/wanglq0086/article/details/60761614 Robot 利用JNI,调用第三方C/C++组件 DJNativeSwing组件 利用html2canvas 利用html2image p

Java实现网页截屏

代码如下 <span style="font-size:18px;">package com.util; import java.awt.AWTException; import java.awt.Desktop; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; import java.awt.Rectangle; import java.awt.Robot; impor

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.*;imp

Android手机截屏

刚开始打算做一个简单的截屏程序时,以为很轻松就能搞定. 在Activity上放一个按钮,点击完成截屏操作,并将数据以图片形式保存在手机中. 动手之前,自然是看书和网上各种查资料.结果发现了解的知识越多,就越发感觉不对劲. 截屏,总以为其类似于其他小应用的开发,有现成的接口或者只需要稍微改动就能达到预期的效果. 一般讲解Android的书籍并没有提到截屏的内容,网上的文章很多,但也没有哪篇能是真正完整,能把解决思路说清楚的. 总结的比较合理的一篇文章题目为“Android截屏学习经历”,出自“ht

为什么 Android 截屏需要 root 权限

Android 截屏问题 看到很多朋友都有一个需求:那就是截取 Android 的整个屏幕,而且大家都遇到一个相同的问题,没有权限.这篇文章主要从代码的角度分析,问什么需要权限,需要什么样的权限?对截屏方法也有一些分析,欢迎大家讨论. Android 截屏 -- 传统方法 一般最开始的 Android 截屏程序,都是来源于 Linux 的截屏方法,android 使用的 Linux 内核,那么 Linux 下的截屏方法也就最先被 android 采用.Linux  使用了 framebuffer

Python写一个像QQ可快捷键唤起区域截屏的应用

1.截屏应用功能拆解 先把要实现哪些功能罗列一下,功能拆解好了,程序设计时就比较清晰. 1).首先要能响应快捷键调起截屏程序,像QQ使用Ctrl+shift+B可以截屏一样: 2).然后就是截图功能,可以用鼠标选取截取的区域: 3).最后是要把截屏保存为本地图片. 2.做一下技术调研 功能拆解出来了,就开始调查下实现难度,有没有现成的第三方库可用,Python是出了名的库多,多找一找总会找到的. 搜寻了一下Python有截图功能的库,基本都是全屏截图和程序输入坐标来区域截图,没办法用鼠标选择可视

Java邮件发送与屏幕截屏

前几天七夕情人节孤独寂寞的程序猿闲来没事,花了一两个小时写了个小Demo主要实现Java的Mail发送功能和桌面截屏功能. 首先让我们先看看Java sendMail邮件发送和桌面屏幕截屏功能是怎么实现的基础知识. 一.Java  SendMail邮件发送 首先让我们来看看邮件发送的原理图: JavaMail 是一套sun 提供开发邮件收发程序API,JavaMail编写程序就是邮件客户端程序(和outlook.foxmail功能类似) * JavaMail开发需要类库 javamail API