千里冰封
          JAVA 濃香四溢
          posts - 151,comments - 2801,trackbacks - 0
          昨天看到留言,于是今天又把一些功能加進進去了

          比如,
          1,程序可以最小化到系統托盤區
          2,程序可以批量保存所有截過的圖片
          3,修正了以前的一個小BUG,那就是輸入保存圖片的文件名時,如果沒有輸入后綴名,將保存正常,如果輸入了后綴名,將會保存格式出錯
          打包文件請點擊這里下載,dist文件夾里面的JAR文件是可以雙擊執行的

          感謝朋友們的建議,謝謝.

          /*
           * CaptureScreen.java
           *
           * Created on 2007年8月30日, 下午12:46
           *
           * To change this template, choose Tools | Template Manager
           * and open the template in the editor.
           
          */

          package hadeslee.swing;

          /**
           *
           * 
          @author lbf
           
          */
          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);
                  JLabel jl1
          =new JLabel("<Html><Font size=5 color=white>作者:千里冰封<br>" +
                          
          "QQ:24325142<br><br><br></Font></html>",JLabel.CENTER);
                  jl.setFont(
          new Font("黑體",Font.BOLD,40));
                  jl.setForeground(Color.RED);
                  jl1.setForeground(Color.BLUE);
                  c.add(jl,BorderLayout.CENTER);
                  c.add(jl1,BorderLayout.SOUTH);
                  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的濃香.
          posted on 2007-09-04 10:51 千里冰封 閱讀(2875) 評論(11)  編輯  收藏 所屬分類: JAVASE

          FeedBack:
          # re: JAVA截屏程序(第四版)
          2007-09-04 12:06 | ww
          謝謝你哦,厲害呀  回復  更多評論
            
          # re: JAVA截屏程序(第四版)
          2007-09-04 12:14 | BeanSoft
          支持, 只不過可能只能運行在 JDK 1.6 了, 因為用了托盤.  回復  更多評論
            
          # re: JAVA截屏程序(第四版)
          2007-09-04 12:42 | 千里冰封
          @BeanSoft
          呵呵,那也是,必須要有所取舍
          并且下載一個JDK6.0也不是很難的事了
          不過,除掉托盤的代碼,JDK5.0也是一樣可以運行的  回復  更多評論
            
          # re: JAVA截屏程序(第四版)[未登錄]
          2007-09-05 09:46 | Samuel
          動作挺快! 不過有幾個地方需要修正。

          1、在最小化的時候,建議先讓用戶設置一下最小化的處理方式(托盤區或者任務欄),2者最好不要同時存在,因為最小化到任務欄,放在托盤區就沒有任何意義了。

          2、關于托盤區的使用,請參看一下TM的使用方式。  回復  更多評論
            
          # re: JAVA截屏程序(第四版)
          2007-09-05 10:24 | 千里冰封
          @Samuel
          呵呵,多謝建議
          程序一開啟就在托盤區. 最小化的時候依然在任務欄
          并不是不想改了,主要是再改的話,還要加菜單給用戶設置,
          所以得做一個取舍,只有去掉設置,而讓面板更易用了  回復  更多評論
            
          # re: JAVA截屏程序(第四版)
          2007-09-05 16:23 | 楊愛友
          太復雜了,看不懂。繼續學習...  回復  更多評論
            
          # re: JAVA截屏程序(第四版)
          2007-09-09 07:31 | sitinspring
          >>dist文件夾里面的JAR文件是可以雙擊執行的

          雙擊執行Jar你是怎么實現的?  回復  更多評論
            
          # re: JAVA截屏程序(第四版)
          2007-09-13 16:46 | myfifi
          呵呵,看了這個截圖程序,不錯!支持!

          雙擊執行Jar你是怎么實現的?

          安裝了jdk1.6自動關聯.jar文件,雙擊即可。  回復  更多評論
            
          # re: JAVA截屏程序(第四版)
          2007-11-05 08:30 | DMman
          不錯,支持  回復  更多評論
            
          # re: JAVA截屏程序(第四版)
          2008-03-31 11:03 | 沈建宏
          學習了,感謝!!!呵呵
          希望有更好的文章出來啊,期待中。。。。。。。。  回復  更多評論
            
          # re: JAVA截屏程序(第四版)
          2012-04-07 20:36 | 498357779
          程序固然是完成了計劃的功能。但是把它連續截屏20或30次以上,就會報:
          java.lang.內存溢出錯誤,不信可以試一下。
          N試不爽。如果用在聊天程序中,連截幾次圖,就悲劇了。
          希望樓主測試修正一下內存問題。
          498357779,聯系  回復  更多評論
            
          主站蜘蛛池模板: 姜堰市| 安塞县| 安顺市| 拉萨市| 平昌县| 渝北区| 繁峙县| 通州区| 大厂| 宾川县| 呼图壁县| 开远市| 方山县| 铜梁县| 民勤县| 桐乡市| 呼和浩特市| 双辽市| 玉门市| 大新县| 霍州市| 南昌市| 宾阳县| 万山特区| 陕西省| 义乌市| 华池县| 岳普湖县| 永登县| 五指山市| 鄂伦春自治旗| 郁南县| 孝义市| 湘潭市| 嵊州市| 南华县| 方山县| 葫芦岛市| 郸城县| 天峻县| 砚山县|