⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 screenframe.java

📁 java下的抓屏工具。。。。............................凑字
💻 JAVA
字号:
package screensnap;

import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class ScreenFrame extends MouseAdapter {

    private Point start; // 鼠标按下去的点
    private Point end; // 鼠标释放时的点
    JFrame topFrame = new JFrame(); // 用来将整个活动屏幕覆盖掉,以实现对区域截图
    JPanel imagePanel; // 区域截屏时,用来显示整个屏幕的截图
    JPanel rectPanel; // 画出鼠标拖动时的选中区域
    final BufferedImage im;

    public ScreenFrame(final Robot robot, Dimension size) {
        rectPanel = new JPanel() {

            @Override
            public void paint(Graphics g) {
                // TODO Auto-generated method stub
                super.paint(g);
                if (start != null && end != null) {
                    int x = start.x <= end.x ? start.x : end.x;
                    int y = start.y <= end.y ? start.y : end.y;
                    Color oldColor = g.getColor();
                    g.setColor(Color.RED);
                    g.drawRect(x, y, Math.abs(end.x - start.x), Math.abs(end.y - start.y));
                    g.setColor(oldColor);
                }
            }
        };
        rectPanel.setOpaque(false);
        topFrame.getLayeredPane().add(rectPanel, new Integer(50));

        rectPanel.setSize(size);
        topFrame.setBounds(0, 0, size.width, size.height);

        Rectangle rct = new Rectangle(0, 0, (int) size.getWidth(), (int) size.getHeight());

        im = robot.createScreenCapture(rct);
        imagePanel = new JPanel() {

            @Override
            public void paint(Graphics g) {
                // TODO Auto-generated method stub
                super.paint(g);
                g.drawImage(im, 0, 0, im.getWidth(), im.getHeight(), null);
            }
        };

        imagePanel.setSize(size);
        rectPanel.setSize(size);

        topFrame.add(imagePanel);
        // 去掉Frame的装饰,变成一个没有边框的面板,实现区域抓屏的关键
        topFrame.setUndecorated(true);
        topFrame.setVisible(true);

        topFrame.addMouseListener(this);

        topFrame.addMouseMotionListener(this);
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        // TODO Auto-generated method stub
        end = e.getPoint();
        rectPanel.repaint();
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub
        topFrame.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
    }

    @Override
    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub
        start = e.getPoint();
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub
        topFrame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
        end = e.getPoint();
        if (invaildRectangle()) {
            topFrame.dispose();
            return;
        }

        Rectangle rct = getDraggedRectangle();

        SystemTrayTool.outputImage2SavePlace(im, rct);

        start = null;
        end = null;
        topFrame.dispose();
    }

    private Rectangle getDraggedRectangle() {
        int x = start.x <= end.x ? start.x : end.x;
        int y = start.y <= end.y ? start.y : end.y;
        Rectangle rct = new Rectangle(x, y, Math.abs(end.x - start.x),
                Math.abs(end.y - start.y));
        return rct;
    }

    private boolean invaildRectangle() {
        return Math.abs(end.x - start.x) <= 0 || Math.abs(end.y - start.y) <= 0;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -