千里冰封
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 千里冰封 阅读(2859) 评论(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,联系  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: