zoukankan      html  css  js  c++  java
  • JAVA实现的截屏程序

    http://hadeslee.iteye.com/blog/125386

    http://www.jb51.net/article/75114.htm

    呵呵,昨天也看到朋友的留言,又增加了一些功能,

    1,增加了一个把截到的图片复制到系统的剪帖板,这样一来就可以直接粘帖到word,photoshop,画图等程序里面了

    2,增加了每截一张图片都会新开一个tab来放它,并且tab里面各自有各自的操作方法.

    点击下载源文件和可执行JAR文件

    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);
      jl.setFont(new Font("黑体",Font.BOLD,40));
      jl.setForeground(Color.RED);
      c.add(jl,BorderLayout.CENTER);
      buttonJP.add(start);
      buttonJP.add(saveAll);
      buttonJP.add(cancel);
      buttonJP.setBorder(BorderFactory.createTitledBorder("公共操作区"));
      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;
     }
    }
  • 相关阅读:
    Group Normalization
    Resnet小记
    Mxnet 查看模型params的网络结构
    ResNets和Inception的理解
    基础 | batchnorm原理及代码详解
    交叉熵代价函数原理
    深度学习笔记:优化方法总结(BGD,SGD,Momentum,AdaGrad,RMSProp,Adam)
    机器学习 logistic分类
    ubuntu16.04 安装搜狗输入法
    工作5年半了,最近准备做一些工作的小结了
  • 原文地址:https://www.cnblogs.com/donaldlee2008/p/5457079.html
Copyright © 2011-2022 走看看