package com.version2;

/**
 * @author xu
 * @create 2019-07-12 13:05
 */
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Fang extends JFrame {

    //private Container container = getContentPane();
    /**
     * 放大镜x坐标
     * 计算方式:setX = absolute - relativeX
     */
    private int setX;
    /**
     * 放大镜y坐标
     * 计算方式:setY = absoluteY - relativeY
     */
    private int setY;

    //鼠标绝对x坐标(相对(0,0)坐标)
    private int absoluteX;
    //鼠标绝对y坐标
    private int absoluteY;
    //鼠标按下时的相对x坐标(相对组件左上角坐标)
    private int relativeX;
    //鼠标按下时的相对y坐标
    private int relativeY;
    //标记鼠标是否按下。如果按下则为true,否则为false
    private boolean mousePressed;
    //放大镜尺寸
    private int FangSize = 0;
    //放大镜内容面板
    private FangJPanel FangJPanel = new FangJPanel(FangSize);

    public Fang() {

        setUndecorated(true); // 窗体无边缘
        setResizable(false);   //my-不可调整大小
        this.add(FangJPanel);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.addMouseListener(new MouseFunctions());
        this.addMouseMotionListener(new MouseMotionFunctions());
        updateSize(FangSize);
        this.setVisible(true);
    }
    /**
     * 更新窗体
     * @param FangSize 放大镜尺寸
     */
    public void updateSize(int FangSize) {
        FangJPanel.setFangSize(FangSize + 100);
        this.setBounds(0,0,FangSize+100,FangSize+100);
        validate(); // 更新所有子控件
    }

    //鼠标设配器
    private class MouseFunctions extends MouseAdapter {
        @Override
        public void mousePressed(MouseEvent e) {
            if (e.getClickCount() == 1) {// 如果鼠标左键点了一下,说明按住了窗体
                mousePressed = true;
                relativeX = e.getX();
                relativeY = e.getY();
                /*my-
                这2个位置指的是相对组件左上角那个坐标的位置
                getX():返回事件相对于源组件的水平x位置。
                getY():返回事件相对于源组件的垂直y位置。
                * */
                //System.out.println("x:"+relativeX+"\ny:"+relativeY);
            }
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            //my-鼠标释放,置为false
            mousePressed = false;
        }
    }

    //MouseMotionAdapter:鼠标运动适配器
    private class MouseMotionFunctions extends MouseMotionAdapter {
        /* my-
         * mouseDragged:鼠标拖动事件
         * java.awt.Component
         * public Point getLocationOnScreen() :以指定组件左上角的点的形式获取此组件的位置。
         * 返回值:Point :代表组件左上角的点的位置。
         */
        @Override
        public void mouseDragged(MouseEvent e) {
            if (mousePressed == true) {
                /*
                 * 如果此时鼠标按下了,说明在拖拽窗体
                 * -my-
                 * my-container.getLocationOnScreen().x
                 * absoluteX:此时鼠标的x坐标
                 * absoluteY:此时鼠标的Y坐标
                 */
                absoluteX = Fang.this.getLocationOnScreen().x + e.getX();
                absoluteY = Fang.this.getLocationOnScreen().y + e.getY();
                //System.out.println(e.getX()+"=="+e.getY());
                //System.out.println(absoluteX+"::"+absoluteY+"  "+relativeX+"::"+relativeY);

                //my-设置放大镜的x,y坐标
                setX = absoluteX - relativeX;
                setY = absoluteY - relativeY;

                //-my-左上角的那个位置
                FangJPanel.setFangLocation(setX, setY);

                setLocation(setX, setY);
            }
        }
    }
}

class FangJPanel extends JPanel {
    private Image screenImage;
    /**
     * 放大镜的尺寸
     */
    private int FangSize;
    private int locationX;
    private int locationY;
    private Robot robot;

    /**
     * 带参数的构造函数
     * @param FangSize
     *         放大尺寸
     */
    public FangJPanel(int FangSize) {
        this.FangSize = FangSize;
        try {
            robot = new Robot();
        } catch (AWTException e) {
        }
        // 截屏幕    my-仅当前屏幕,切换其他无效-原因:只截图了一次
        //my-Rectangle:长方形
        screenImage = robot.createScreenCapture(new Rectangle(0, 0,
                Toolkit.getDefaultToolkit().getScreenSize().width,
                Toolkit.getDefaultToolkit().getScreenSize().height));

        //forWindows
        /*screenImage = robot.createScreenCapture(new Rectangle(0, 0,
                (int)(Toolkit.getDefaultToolkit().getScreenSize().width*1.5),
                (int)(Toolkit.getDefaultToolkit().getScreenSize().height*1.5)
        ));*/
    }

    /**
     * 设置放大镜的位置
     * @param locationX
     *         x坐标
     * @param locationY
     *         y坐标
     */
    public void setFangLocation(int locationX, int locationY) {
        this.locationX = locationX;
        this.locationY = locationY;
        repaint(); // 注意重画控件
    }

    /**
     * 设置放大镜的尺寸
     * @param FangSize
     *         放大镜尺寸
     */
    public void setFangSize(int FangSize) {
        this.FangSize = FangSize;
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent((Graphics2D) g);
        // 关键处理代码
        /*// 要画的图片
        // 目标矩形的第一个角的x坐标
        // 目标矩形的第一个角的y坐标
        // 目标矩形的第二个角的x坐标
        // 目标矩形的第二个角的y坐标
        * */
        /*g.drawImage(screenImage, 0, 0, FangSize, FangSize,
                locationX + (FangSize / 8 * 3), // 源矩形的第一个角的x坐标
                locationY + (FangSize / 8 * 3), // 源矩形的第一个角的y坐标
                locationX + (FangSize / 8 * 5), // 源矩形的第二个角的x坐标
                locationY + (FangSize / 8 * 5), // 源矩形的第二个角的y坐标
                this);*/
        g.drawImage(screenImage, 0, 0, FangSize, FangSize,
                locationX + (FangSize / 4),
                locationY + (FangSize / 4),
                locationX + (FangSize / 4 * 3),
                locationY + (FangSize / 4 * 3),
                this);
        //forWindows
        /*g.drawImage(screenImage, 0, 0, (int)(FangSize*1.5), (int)(FangSize*1.5),
                (int)((locationX + (FangSize / 4))*1.5),
                (int)((locationY + (FangSize / 4))*1.5),
                (int)((locationX + (FangSize / 4 * 3))*1.5),
                (int)((locationY + (FangSize / 4 * 3))*1.5),
                this);*/

    }

    public static void main(String arg[]) {
        Fang Fang = new Fang();
    }
}
最近下载更多
CxlyboSoft  LV6 2020年2月16日
moyec50  LV1 2019年7月30日
hsl2019  LV3 2019年7月25日
旧梦圆  LV1 2019年7月24日
Demons_Robin  LV7 2019年7月23日
谭鬼鬼  LV48 2019年7月21日
最代码官方  LV167 2019年7月15日
最近浏览更多
jkjfdgbkl  LV2 2023年11月2日
暂无贡献等级
猪皮怪 2022年6月12日
暂无贡献等级
wubinbin  LV11 2022年2月13日
shisun  LV3 2021年7月5日
大连有个马猴  LV4 2020年12月19日
jpfjpfjpf  LV1 2020年12月12日
段朝洪  LV15 2020年11月21日
jeed141305  LV1 2020年7月4日
Andy0211 2020年7月1日
暂无贡献等级
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友