欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java編程實(shí)現(xiàn)屏幕截圖(截屏)代碼總結(jié)

 更新時(shí)間:2015年11月19日 10:37:55   作者:阮斯哲(技術(shù)-2273)  
這篇文章主要介紹了java編程實(shí)現(xiàn)屏幕截圖(截屏)代碼,結(jié)合3個(gè)實(shí)例總結(jié)分析了Java截屏?xí)r頁(yè)面抓取及圖片保存的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下

本文實(shí)例總結(jié)了常見(jiàn)的java編程實(shí)現(xiàn)屏幕截圖方法。分享給大家供大家參考,具體如下:

方法一:

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);
  //自動(dòng)打開(kāi)
  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.*;
/**
 * 一個(gè)簡(jiǎn)單的屏幕抓圖
 * 
 **/
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;
  }
  /** 捕捉屏幕的一個(gè)矯形區(qū)域 */
  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());
  }
  /**
   * 儲(chǔ)存為一個(gè)文件,為PNG格式
   * 
   * @deprecated replaced by saveAsPNG(File file)
   **/
  @Deprecated
  public void saveToFile(File file) throws IOException {
    ImageIO.write(getPickedImage(), defaultImageFormater, file);
  }
  /** 儲(chǔ)存為一個(gè)文件,為PNG格式 */
  public void saveAsPNG(File file) throws IOException {
    ImageIO.write(getPickedImage(), "png", file);
  }
  /** 儲(chǔ)存為一個(gè)JPEG格式圖像文件 */
  public void saveAsJPEG(File file) throws IOException {
    ImageIO.write(getPickedImage(), "JPEG", file);
  }
  /** 寫(xiě)入一個(gè)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;
}

方法三:

因?yàn)橛凶钚』较到y(tǒng)托盤(pán),還是需要一張名為bg.gif作為托盤(pán)圖標(biāo),圖片應(yīng)放在同級(jí)目錄下,否則會(huì)空指針異常。

主要的截屏代碼部分是:

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

(源代碼來(lái)源于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;//一個(gè)放置很多份圖片
 private int index;//一個(gè)一直會(huì)遞增的索引,用于標(biāo)認(rèn)圖片
 private JRadioButton java,system;//JAVA界面,系統(tǒng)界面
 /** 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("開(kāi)始截取");
  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("公共操作區(qū)"));
  JPanel jp=new JPanel();//放兩個(gè)單選按鈕的面板
  jp.add(java=new JRadioButton("java界面"));
  jp.add(system=new JRadioButton("系統(tǒng)界面",true));
  java.addActionListener(this);
  system.addActionListener(this);
  jp.setBorder(BorderFactory.createTitledBorder("界面風(fēng)格"));
  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("關(guān)于")).addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent ae){
     JOptionPane.showMessageDialog(CaptureScreen.this,"<html><Font color=red><center><h2>關(guān)于</h2></center></Font>" +
       "這是一款純JAVA的屏幕截取程序<br>在以前的基礎(chǔ)上增加了一些常用的功能,<br>" +
       "比如,批量保存,多幅截取,復(fù)制到系統(tǒng)粘帖板...<br>" +
       "在使用過(guò)程中有任何問(wèn)題,歡迎聯(lián)系.<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("開(kāi)始截取")).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,則表示一張圖片都沒(méi)有被加入過(guò),
   //則要清除當(dāng)前的東西,重新把tabpane放進(jìn)來(lái)
   if(index==0){
    c.removeAll();
    c.add(jtp,BorderLayout.CENTER);
   }else{//否則的話,直接對(duì)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毫秒是為了讓主窗完全不見(jiàn)
   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,"圖片不能為空!!","錯(cuò)誤",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()));
   }
   //起一個(gè)線程去保存這些圖片并顯示出進(jìn)度條
   new SaveAllThread(ext,about).setVisible(true);
  }
 }
 //專(zhuān)門(mén)用來(lái)保存所有圖片的線程類(lèi),它還要顯示出保存的進(jìn)度條
 private class SaveAllThread extends JDialog implements Runnable{
  private String name;//文件名頭部份
  private String ext;//文件格式
  private JProgressBar jpb;//一個(gè)進(jìn)度條
  private JLabel info;// 一個(gè)信息顯示條
  private int allTask,doneTask;//所有任務(wù),已完成任務(wù)
  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();
   }
  }
 }
 /**
  *公用的處理保存圖片的方法
  *這個(gè)方法不再私有了
  */
 public void doSave(BufferedImage get){
  try{
   if(get==null){
    JOptionPane.showMessageDialog(this,"圖片不能為空!!","錯(cuò)誤",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();
  }
 }
 /**
  *公共的處理把當(dāng)前的圖片加入剪帖板的方法
  */
 public void doCopy(final BufferedImage image){
  try{
   if(get==null){
    JOptionPane.showMessageDialog(this,"圖片不能為空!!","錯(cuò)誤",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,"已復(fù)制到系統(tǒng)粘帖板!!");
  }catch(Exception exe){
   exe.printStackTrace();
   JOptionPane.showMessageDialog(this,"復(fù)制到系統(tǒng)粘帖板出錯(cuò)!!","錯(cuò)誤",JOptionPane.ERROR_MESSAGE);
  }
 }
 //處理關(guān)閉事件
 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();
  }
 }
 //一個(gè)內(nèi)部類(lèi),它表示一個(gè)面板,一個(gè)可以被放進(jìn)tabpane的面板
 //也有自己的一套處理保存和復(fù)制的方法
 private class PicPanel extends JPanel implements ActionListener{
  JButton save,copy,close;//表示保存,復(fù)制,關(guān)閉的按鈕
  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("復(fù)制到剪帖板(C)");
   close=new JButton("關(guān)閉(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格式的過(guò)濾器
 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格式的過(guò)濾器
 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格式的過(guò)濾器
 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格式的過(guò)濾器
 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圖像)";
  }
 }
 //一個(gè)暫時(shí)類(lèi),用于顯示當(dāng)前的屏幕圖像
 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);//表示選中的區(qū)域
  private Cursor cs=new Cursor(Cursor.CROSSHAIR_CURSOR);//表示一般情況下的鼠標(biāo)狀態(tài)
  private States current=States.DEFAULT;// 表示當(dāng)前的編輯狀態(tài)
  private Rectangle[] rec;//表示八個(gè)編輯點(diǎn)的區(qū)域
  //下面四個(gè)常量,分別表示誰(shuí)是被選中的那條線上的端點(diǎn)
  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;//當(dāng)前被選中的X和Y,只有這兩個(gè)需要改變
  private Point p=new Point();//當(dāng)前鼠標(biāo)移的地點(diǎn)
  private boolean showTip=true;//是否顯示提示.如果鼠標(biāo)左鍵一按,則提示不再顯了
  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("請(qǐng)按住鼠標(biāo)左鍵不放選擇截圖區(qū)",p.x,p.y+15);
   }
  }
  //根據(jù)東南西北等八個(gè)方向決定選中的要修改的X和Y的座標(biāo)
  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();
   }
  }
  //特意定義一個(gè)方法處理鼠標(biāo)移動(dòng),是為了每次都能初始化一下所要選擇的地區(qū)
  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();
   }
  });
 }
}
//一些表示狀態(tài)的枚舉
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;
 }
}

希望本文所述對(duì)大家Java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Java并發(fā)工具類(lèi)Exchanger的相關(guān)知識(shí)總結(jié)

    Java并發(fā)工具類(lèi)Exchanger的相關(guān)知識(shí)總結(jié)

    今天給大家?guī)?lái)的文章是Java工具類(lèi)Exchanger的相關(guān)知識(shí)總結(jié),文中有非常詳細(xì)的介紹及代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-06-06
  • Java方法參數(shù)傳遞如何實(shí)現(xiàn)

    Java方法參數(shù)傳遞如何實(shí)現(xiàn)

    這篇文章主要介紹了Java方法參數(shù)傳遞如何實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Spring bean為什么需要依賴(lài)注入

    Spring bean為什么需要依賴(lài)注入

    本篇文章主要介紹了Spring依賴(lài)注入的三種方式小結(jié),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-07-07
  • Spark SQL關(guān)于性能調(diào)優(yōu)選項(xiàng)詳解

    Spark SQL關(guān)于性能調(diào)優(yōu)選項(xiàng)詳解

    這篇文章將為大家詳細(xì)講解有關(guān)Spark SQL性能調(diào)優(yōu)選項(xiàng),小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲
    2023-02-02
  • 深入理解Java中的Properties類(lèi)

    深入理解Java中的Properties類(lèi)

    Properties類(lèi)是Java中用于處理配置文件的工具類(lèi),它繼承自 Hashtable類(lèi),實(shí)現(xiàn)了Map接口,本文主要介紹了Java中的Properties類(lèi),感興趣的可以了解一下
    2024-01-01
  • maven配置文件pom增加變量取版本號(hào)方式

    maven配置文件pom增加變量取版本號(hào)方式

    這篇文章主要介紹了maven配置文件pom增加變量取版本號(hào)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 基于重定向RedirectAttributes的用法解析

    基于重定向RedirectAttributes的用法解析

    這篇文章主要介紹了基于重定向RedirectAttributes的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java程序執(zhí)行的全流程

    Java程序執(zhí)行的全流程

    這篇文章主要介紹了Java程序執(zhí)行的全流程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java實(shí)現(xiàn)電影院訂票系統(tǒng)代碼

    Java實(shí)現(xiàn)電影院訂票系統(tǒng)代碼

    這篇文章主要介紹了Java實(shí)現(xiàn)電影院訂票系統(tǒng)代碼,代碼實(shí)現(xiàn)了界面類(lèi)登錄注冊(cè)類(lèi),用戶類(lèi)等,具有一定參考價(jià)值,需要的朋友可以參考下。
    2017-11-11
  • JavaMe開(kāi)發(fā)繪制文本框TextEdit

    JavaMe開(kāi)發(fā)繪制文本框TextEdit

    在JavaMe連載(3)-也說(shuō)MVC設(shè)計(jì)模式 一文中提到了一個(gè)TextEdit類(lèi),但沒(méi)有給出具體實(shí)現(xiàn),TextEdit是采用GameCanvas繪制的文本編輯器。本文結(jié)合實(shí)例給出實(shí)現(xiàn)的方法。
    2015-09-09

最新評(píng)論