`

JAVA截屏程序(第四版) (转)

    博客分类:
  • java
阅读更多
/*
 * 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;
    }
}

 

要使用jdk1.6

 

 

 

分享到:
评论

相关推荐

    java程序设计报告模板

    第四部分:心得体会 - **学习体会**:分享在项目开发过程中的收获和感悟。 - **改进建议**:提出项目中存在的不足之处及改进建议。 - **未来展望**:对个人或项目未来发展方向的看法。 #### 三、编写建议 - **...

    java源码包---java 源码 大量 实例

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...

    JSP程序设计技术教程 第四章项目实训源代码及截图

    在本资源中,我们主要探讨的是JSP(JavaServer Pages)程序设计技术,特别是通过一个实际项目的第四章实训来深入理解这一技术。JSP是一种基于Java的服务器端脚本语言,用于生成动态网页内容。本教程的核心是通过实践...

    JAVA程序设计实验报告

    本实验报告是针对大学生JAVA程序设计课程的,基于吕凤翥第二版教材,旨在通过实际操作加深对JAVA语言的理解,特别是GUI(图形用户界面)菜单设计方面的能力培养。实验的主要目标是让学生掌握菜单设计、弹出菜单设计...

    java下载(含截图)

    - Java SE (Standard Edition) 是用于开发桌面应用程序的标准版 Java 平台。 - 选择正确的 Java 版本对于后续的开发工作至关重要。 3. **关键知识点**: - **Java SE**: 主要用于开发桌面应用,包含了基本的 ...

    JAVA上百实例源码以及开源项目源代码

    Java编写的山寨QQ,多人聊天+用户在线 21个目标文件 摘要:JAVA源码,媒体网络,山寨QQ,Java聊天程序 Java编写的山寨QQ,多人聊天+用户在线,程序分服务端和客户端,典型C/S结构, 当用户发送第一次请求的时候,验证...

    java SE第1次实验报告要求

    3. 时间安排上,你需要在第6周的星期四(4月3日)提交报告。这意味着你需要提前规划好时间,确保有足够的时间完成实验、调试代码和撰写报告。 在撰写报告时,可以按照以下结构进行: - 引言:简单介绍实验的目标和...

    【藏宝图】(珍藏版)2012java开发工程师必备精品资料(115)

    #### 三十一、Java大学教程(JavaHowtoProgram)(第四版)中文版 这本书详细介绍了Java编程的基本概念和技术,适合大学阶段的Java课程教学。 #### 三十二、Java+Eclipse实战视频教程第一集 这份教程通过10集的视频...

    java版投票系统

    - **丁振凡**,《Java语言实用教程实验指导(第2版)》[M],北京邮电大学出版社,2008.1 - **杨树林等**,《Java语言最新实用案例教程(第2版)》[M],清华大学出版社,2010.7 #### 七、课程设计进度安排 1. **准备阶段...

    Java课程设计任务书

    5. 如果设计题目来源于《Java课程设计案例精编(第二版)》,则需要在此基础上增加1-2项新功能。 课程设计报告应包含以下部分: 1. 封面 2. 目录 3. 系统描述:介绍系统的功能和解决的问题 4. 分析与设计:功能模块...

    java工程的创建简单易懂,截图教程

    - **第四步:** 在`WEB-INF`目录下新建`web.xml`文件。该文件用于定义Web应用的基本配置信息。文件的内容如下: ```xml &lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi=...

    从零开始搭建SpringCloud第三节源码及截图

    在本节中,我们将深入探讨如何从零开始搭建SpringCloud项目,并通过源码分析和相关截图来理解这一过程。SpringCloud作为一个微服务框架,提供了一系列工具和服务,帮助开发者快速构建分布式系统。它包括服务发现、...

    编译原理实验四-语义分析

    实验结果以截图的形式展示,可以直观地看到输入表达式经过语义分析后的四元式序列,从而验证程序的正确性。 在“src”目录下,包含了实验的主要源代码,这些代码实现了递归下降分析器的各种函数,对应于文法的不同...

    JAVA学习笔记-java学习笔记WORD样式.docx

    #### 八、第一个Java程序:HelloWorld ```java class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } } ``` 1. **程序结构**: - 定义类:`class HelloWorld`...

    编译原理实验报告+语法分析代码(C语言)

    词法分析是编译器的第一个阶段,它的任务是识别源代码中的关键字、标识符、常量、运算符等基本元素。在这个实验中,词法分析器可能通过扫描输入的字符流,根据预定义的正则表达式来识别不同的标记。每个识别出的标记...

    java课程设计完成稿.docx

    《Java2实用教程(第三版)》北京清华大学出版社2006.8 - [2] 朱福喜.《Java语言程序设计》.北京清华大学出版社.2005 - [3] 朱福喜,尹为民,余振坤.《Java语言与面向对象程序设计》.武汉武汉大学出版社.2002 ...

    JSP实用教程案例及素材

    《JSP实用教程案例及素材》是一本专为学习Java Server Pages(JSP)技术而设计的实践指导书籍。该书以丰富的实例为载体,帮助读者深入理解和掌握JSP的基本概念、语法特性以及在实际开发中的应用。通过本书,读者可以...

    java课程设计之学生信息管理系统源码.zip

    java学习 该系统对应于上次我们演示的jsp学生管理系统,如果想看jsp的学生管理系统请在我的博客或者视频列表里查看,地址最后会给出的。这款Java swing实现的学生信息管理系统和jsp版本的功能很相似,简单的实现了...

    Java swing实现学生信息管理系统源码+文档

    这款Java swing实现的学生信息管理系统和jsp版本的功能很相似,简单的实现了班级信息的增删改查,学生信息的增删改查,数据库采用的是mysql,jdk版本不限,是Java学习者学习参考非常好的一个小项目,下面我们来看看...

Global site tag (gtag.js) - Google Analytics