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日
最代码官方 LV168
2019年7月15日
最近浏览更多
dearxo2014 LV1
2024年11月9日
jkjfdgbkl LV2
2023年11月2日
微信网友_6619529767260160
2023年8月24日
暂无贡献等级
猪皮怪
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日

