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

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

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

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

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

  1. java实现屏幕截屏功能

    最近在项目中遇到这样一个需求,用户生成推广海报想要发送给朋友,但是推广海报是用html网页写的,这时候想要分享给朋友的话只能用户自己手机截图,显然这样的用户体验是不友好的,如果可以给用户一个按钮实现一 ...

  2. JAVA之网页截屏

    先吐槽一下下: 表示接近两个月没有敲代码了,现在看一下代码都感觉有点生了.三天打鱼两天晒网是不行的,再说我本来就有“健忘症”,真的是木有办法啊 ̄へ ̄.我一直信奉一句话:“勤能补拙”,它也是我学习路上的 ...

  3. 一个基于Qt的截屏程序

    最近有一个arm板上的程序需要重写用户手册,在网上找了许久,没找到合适的截屏工具.于是只好自己动手做一个了. 因为arm板上有已经有了Qt环境,于是想到用 Qt的QPixmap::grabWindow ...

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

    公司最近有个需求:把用户第一次的测量身体信息和最近一次测量信息进行对比,并且需要把对比的数据截成图片可以发给用户(需要在不打开网页的情况下实时对网页进行截图然后保存到服务器上,返回图片地址),通过网上 ...

  5. Java实现网页截屏

    原文:http://www.open-open.com/code/view/1424006089452 import java.awt.AWTException; import java.awt.De ...

  6. Java开发的一个简单截屏工具

    //源代码 import java.awt.*;import java.awt.datatransfer.DataFlavor;import java.awt.datatransfer.Transfe ...

  7. Android手机截屏

    刚开始打算做一个简单的截屏程序时,以为很轻松就能搞定. 在Activity上放一个按钮,点击完成截屏操作,并将数据以图片形式保存在手机中. 动手之前,自然是看书和网上各种查资料.结果发现了解的知识越多 ...

  8. android4.3 截屏功能的尝试与失败分析

    1.背景 上一篇讲了在源码中捕获到了android手机的截屏函数(同时按下电源键与音量减,详情http://blog.csdn.net/buptgshengod/article/details/199 ...

  9. Android开发笔记:安卓程序截屏方法

    1,基于Android SDK的截屏方法 (1)主要就是利用SDK提供的View.getDrawingCache()方法.网上已经有很多的实例了.首先创建一个android project,然后进行L ...

随机推荐

  1. 如何在sharepoint里通过correlation id查找详细的错误信息

    Sharepoint里我们经常遇到这样的错误信息: 我们能通过下面的power shell 命令来查到详细的错误信息: $correlationid = "943e6e9c-b5d9-207 ...

  2. flash跨域策略文件crossdomain.xml配置详解

    来源:http://www.2cto.com/Article/201108/100008.html 0x01 简介 flash在跨域时唯一的限制策略就是crossdomain.xml文件,该文件限制了 ...

  3. vs2010使用C

    html, body { font-size: 15px; } body { font-family: Helvetica, "Hiragino Sans GB", 微软雅黑, & ...

  4. CREATE SCHEMA

    CREATE SCHEMA 创建一个架构,即命名空间,在这个空间中可以进一步定义包含表.视图和权限定义等对象. 语法 CREATE SCHEMA AUTHORIZATION owner    [ &l ...

  5. 由浅到深理解java反射

    1.基础概念 class类: 1.1java是面向对象的,但是在java中存在两种东西不是面向对象的 一种是普通的数据类型,这也是封装数据类存在的原因. 二种是静态静态成员. 1.2所以我们首先要理解 ...

  6. NoSql的产生

    主流的关系型数据库:Microsoft SQLServer, IBM DB2, Oracle, MySQL, Microsoft Access, Sybase,IBM Informix 随着互联网we ...

  7. Spring Boot 系列教程1-HelloWorld

    入门 如果你用过Spring JavaConfig的话,会发现虽然没有了xml配置的繁琐,但是使用各种注解导入也是很大的坑, 然后在使用一下Spring Boot,你会有一缕清风拂过的感觉, 真是爽的 ...

  8. Hibernate 系列教程1-枚举单例类

    你还在为不知道怎样正确使用Hibernate而纠结吗 你还在为不知道怎样配置映射文件而郁闷吗 枚举单例(Enum Singleton) 是实现单例模式的一种方式而已,不过写法简单,创建枚举默认也是线程 ...

  9. POJ1556 The Doors 叉积+最短路

    题目大意:求从(0,5)到(10,5)的最短距离,起点与终点之间有n堵墙,每个墙有2个门. 题目思路:判断两点间是否有墙(判断两点的连线是否与某一堵墙的线段相交),建立一个图,然后最短路求出就可以了. ...

  10. UIView回调方法(可以在添加子视图等,做一些额外操作)

    didAddSubview didMoveToSuperview willMoveToSuperview didMoveToWindow willMoveToWindow willRemoveSubv ...