<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    千里冰封
    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,聯系  回復  更多評論
      
    主站蜘蛛池模板: 亚洲国产一区二区视频网站| 久久久国产精品福利免费| 亚洲一日韩欧美中文字幕在线| 色拍自拍亚洲综合图区| 亚洲av成人无码久久精品| 亚洲电影免费在线观看| 亚洲av无码精品网站| 亚洲欧洲日产国码久在线观看 | 99re6在线视频精品免费下载| 国产无遮挡裸体免费视频在线观看| 99麻豆久久久国产精品免费| 岛国精品一区免费视频在线观看| 美女无遮挡拍拍拍免费视频| 水蜜桃视频在线观看免费播放高清| 99视频在线观看免费| 99视频在线精品免费| 国产精品1024永久免费视频| 免费A级毛片无码免费视| 女人张开腿给人桶免费视频| 国产一级淫片a免费播放口之| 亚洲国产人成中文幕一级二级| 在线亚洲人成电影网站色www | 成人免费午夜视频| 国产亚洲精品免费| 国外亚洲成AV人片在线观看| 亚洲国产人成网站在线电影动漫| 亚洲婷婷天堂在线综合| 亚洲伊人久久大香线蕉AV| 免费高清A级毛片在线播放| a级毛片毛片免费观看久潮 | 国产综合成人亚洲区| 国产99视频精品免费视频76| 美女在线视频观看影院免费天天看| 精品熟女少妇av免费久久| 日韩黄色免费观看| 伊人久久大香线蕉亚洲| 亚洲欧洲国产精品久久| 亚洲youwu永久无码精品 | 亚洲熟妇无码av另类vr影视| 免费播放国产性色生活片| 一个人免费日韩不卡视频|