JAVA实现的截屏程序

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

转载于:https://www.cnblogs.com/donaldlee2008/p/5457079.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值