首页 > 编程 > Java > 正文

java编程实现屏幕截图(截屏)代码总结

2019-11-26 14:50:32
字体:
来源:转载
供稿:网友

本文实例总结了常见的java编程实现屏幕截图方法。分享给大家供大家参考,具体如下:

方法一:

import java.awt.Desktop;import java.awt.Dimension;import java.awt.Rectangle;import java.awt.Robot;import java.awt.Toolkit;import java.awt.image.BufferedImage;import java.io.File;import javax.imageio.ImageIO;public class CaptureScreen { public static void captureScreen(String fileName, String folder) throws Exception {  Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();  Rectangle screenRectangle = new Rectangle(screenSize);  Robot robot = new Robot();  BufferedImage image = robot.createScreenCapture(screenRectangle);  //保存路径  File screenFile = new File(fileName);  if (!screenFile.exists()) {   screenFile.mkdir();  }  File f = new File(screenFile, folder);  ImageIO.write(image, "png", f);  //自动打开  if (Desktop.isDesktopSupported()     && Desktop.getDesktop().isSupported(Desktop.Action.OPEN))     Desktop.getDesktop().open(f); } public static void main(String[] args) {  try {   captureScreen("e://你好","11.png");  } catch (Exception e) {   // TODO Auto-generated catch block   e.printStackTrace();  } }}

方法二:

package com.qiu.util;import java.io.*;import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.awt.image.*;import javax.imageio.*;/** * 一个简单的屏幕抓图 *  **/public class ScreenCapture {  // test main  public static void main(String[] args) throws Exception {    String userdir = System.getProperty("user.dir");    File tempFile = new File("d:", "temp.png");    ScreenCapture capture = ScreenCapture.getInstance();    capture.captureImage();    JFrame frame = new JFrame();    JPanel panel = new JPanel();    panel.setLayout(new BorderLayout());    JLabel imagebox = new JLabel();    panel.add(BorderLayout.CENTER, imagebox);    imagebox.setIcon(capture.getPickedIcon());    capture.saveToFile(tempFile);    capture.captureImage();    imagebox.setIcon(capture.getPickedIcon());    frame.setContentPane(panel);    frame.setSize(400, 300);    frame.show();    System.out.println("Over");  }  private ScreenCapture() {    try {      robot = new Robot();    } catch (AWTException e) {      System.err.println("Internal Error: " + e);      e.printStackTrace();    }    JPanel cp = (JPanel) dialog.getContentPane();    cp.setLayout(new BorderLayout());    labFullScreenImage.addMouseListener(new MouseAdapter() {      public void mouseReleased(MouseEvent evn) {        isFirstPoint = true;        pickedImage = fullScreenImage.getSubimage(recX, recY, recW,            recH);        dialog.setVisible(false);      }    });    labFullScreenImage.addMouseMotionListener(new MouseMotionAdapter() {      public void mouseDragged(MouseEvent evn) {        if (isFirstPoint) {          x1 = evn.getX();          y1 = evn.getY();          isFirstPoint = false;        } else {          x2 = evn.getX();          y2 = evn.getY();          int maxX = Math.max(x1, x2);          int maxY = Math.max(y1, y2);          int minX = Math.min(x1, x2);          int minY = Math.min(y1, y2);          recX = minX;          recY = minY;          recW = maxX - minX;          recH = maxY - minY;          labFullScreenImage.drawRectangle(recX, recY, recW, recH);        }      }      public void mouseMoved(MouseEvent e) {        labFullScreenImage.drawCross(e.getX(), e.getY());      }    });    cp.add(BorderLayout.CENTER, labFullScreenImage);    dialog.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));    dialog.setAlwaysOnTop(true);    dialog.setMaximumSize(Toolkit.getDefaultToolkit().getScreenSize());    dialog.setUndecorated(true);    dialog.setSize(dialog.getMaximumSize());    dialog.setModal(true);  }  // Singleton Pattern  public static ScreenCapture getInstance() {    return defaultCapturer;  }  /** 捕捉全屏慕 */  public Icon captureFullScreen() {    fullScreenImage = robot.createScreenCapture(new Rectangle(Toolkit        .getDefaultToolkit().getScreenSize()));    ImageIcon icon = new ImageIcon(fullScreenImage);    return icon;  }  /** 捕捉屏幕的一个矫形区域 */  public void captureImage() {    fullScreenImage = robot.createScreenCapture(new Rectangle(Toolkit        .getDefaultToolkit().getScreenSize()));    ImageIcon icon = new ImageIcon(fullScreenImage);    labFullScreenImage.setIcon(icon);    dialog.setVisible(true);  }  /** 得到捕捉后的BufferedImage */  public BufferedImage getPickedImage() {    return pickedImage;  }  /** 得到捕捉后的Icon */  public ImageIcon getPickedIcon() {    return new ImageIcon(getPickedImage());  }  /**   * 储存为一个文件,为PNG格式   *    * @deprecated replaced by saveAsPNG(File file)   **/  @Deprecated  public void saveToFile(File file) throws IOException {    ImageIO.write(getPickedImage(), defaultImageFormater, file);  }  /** 储存为一个文件,为PNG格式 */  public void saveAsPNG(File file) throws IOException {    ImageIO.write(getPickedImage(), "png", file);  }  /** 储存为一个JPEG格式图像文件 */  public void saveAsJPEG(File file) throws IOException {    ImageIO.write(getPickedImage(), "JPEG", file);  }  /** 写入一个OutputStream */  public void write(OutputStream out) throws IOException {    ImageIO.write(getPickedImage(), defaultImageFormater, out);  }  // singleton design pattern  private static ScreenCapture defaultCapturer = new ScreenCapture();  private int x1, y1, x2, y2;  private int recX, recY, recH, recW; // 截取的图像  private boolean isFirstPoint = true;  private BackgroundImage labFullScreenImage = new BackgroundImage();  private Robot robot;  private BufferedImage fullScreenImage;  private BufferedImage pickedImage;  private String defaultImageFormater = "png";  private JDialog dialog = new JDialog();}/** 显示图片的Label */class BackgroundImage extends JLabel {  public void paintComponent(Graphics g) {    super.paintComponent(g);    g.drawRect(x, y, w, h);    String area = Integer.toString(w) + " * " + Integer.toString(h);    g.drawString(area, x + (int) w / 2 - 15, y + (int) h / 2);    g.drawLine(lineX, 0, lineX, getHeight());    g.drawLine(0, lineY, getWidth(), lineY);  }  public void drawRectangle(int x, int y, int width, int height) {    this.x = x;    this.y = y;    h = height;    w = width;    repaint();  }  public void drawCross(int x, int y) {    lineX = x;    lineY = y;    repaint();  }  int lineX, lineY;  int x, y, h, w;}

方法三:

因为有最小化到系统托盘,还是需要一张名为bg.gif作为托盘图标,图片应放在同级目录下,否则会空指针异常。

主要的截屏代码部分是:

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

(源代码来源于CSDN)

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程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表