package com.mocake.jna;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Magnifier extends JFrame {
/**
* 主容器
*/
private Container container = getContentPane();
/**
* 放大镜x坐标
* 计算方式:setCoordinateX = absoluteCoordinateX
* - relativeCoordinateXWhenMousePressed
*/
private int setCoordinateX;
/**
* 放大镜y坐标
* 计算方式:setCoordinateY = absoluteCoordinateY
* - relativeCoordinateYWhenMousePressed
*/
private int setCoordinateY;
/**
* 鼠标绝对x坐标
*/
private int absoluteCoordinateX;
/**
* 鼠标绝对y坐标
*/
private int absoluteCoordinateY;
/**
* 鼠标按下时的相对x坐标
*/
private int relativeCoordinateXWhenMousePressed;
/**
* 鼠标按下时的相对y坐标
*/
private int relativeCoordinateYWhenMousePressed;
/**
* 标记鼠标是否按下。如果按下则为true,否则为false
*/
private boolean mousePressedNow;
/**
* 放大镜尺寸
*/
private int magnifierSize = 100;
/**
* 放大镜内容面板
*/
private MagnifierPanel magnifierPanel = new MagnifierPanel(magnifierSize);
/**
* 构造函数,创建一个放大镜窗体
*/
public Magnifier() {
setUndecorated(true); // 窗体边缘
setResizable(false);
container.add(magnifierPanel);
addMouseListener(new MouseFunctions());
addMouseMotionListener(new MouseMotionFunctions());
updateSize(magnifierSize);
this.setVisible(true);
}
/**
* 程序入口点
*
* @param arg
* 启动参数,这里为空
*/
public static void main(String arg[]) {
Magnifier magnifier = new Magnifier();
magnifier.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
/**
* 更新窗体
*
* @param magnifierSize
* 放大镜尺寸
*/
public void updateSize(int magnifierSize) {
magnifierPanel.setMagnifierSize(magnifierSize + 100);
setSize(magnifierSize + 100, magnifierSize + 100);
validate(); // 更新所有子控件
}
private class MouseFunctions extends MouseAdapter {
public void mousePressed(MouseEvent e) {
if (e.getClickCount() == 1) {// 如果鼠标左键点了一下,说明按住了窗体
mousePressedNow = true;
relativeCoordinateXWhenMousePressed = e.getX();
relativeCoordinateYWhenMousePressed = e.getY();
}
}
public void mouseReleased(MouseEvent e) {
mousePressedNow = false;
}
}
private class MouseMotionFunctions extends MouseMotionAdapter {
public void mouseDragged(MouseEvent e) {
if (mousePressedNow == true) {// 如果此时鼠标按下了,说明在拖拽窗体
absoluteCoordinateX = Magnifier.this.getLocationOnScreen().x
+ e.getX();
absoluteCoordinateY = Magnifier.this.getLocationOnScreen().y
+ e.getY();
setCoordinateX = absoluteCoordinateX
- relativeCoordinateXWhenMousePressed;
setCoordinateY = absoluteCoordinateY
- relativeCoordinateYWhenMousePressed;
magnifierPanel.setMagnifierLocation(setCoordinateX,
setCoordinateY);
setLocation(setCoordinateX, setCoordinateY);
}
}
}
}
class MagnifierPanel extends JPanel {
private Image screenImage;
/**
* 放大镜的尺寸
*/
private int magnifierSize;
private int locationX;
private int locationY;
private Robot robot;
/**
* 带参数的构造函数
* @param magnifierSize
* 放大尺寸
*/
public MagnifierPanel(int magnifierSize) {
try {
robot = new Robot();
} catch (AWTException e) {
}
// 截屏幕
screenImage = robot.createScreenCapture(new Rectangle(0, 0, Toolkit
.getDefaultToolkit().getScreenSize().width, Toolkit
.getDefaultToolkit().getScreenSize().height));
this.magnifierSize = magnifierSize;
}
/**
* 设置放大镜的位置
* @param locationX
* x坐标
* @param locationY
* y坐标
*/
public void setMagnifierLocation(int locationX, int locationY) {
this.locationX = locationX;
this.locationY = locationY;
repaint(); // 注意重画控件
}
/**
* 设置放大镜的尺寸
* @param magnifierSize
* 放大镜尺寸
*/
public void setMagnifierSize(int magnifierSize) {
this.magnifierSize = magnifierSize;
}
public void paintComponent(Graphics g) {
super.paintComponent((Graphics2D) g);
// 关键处理代码
g.drawImage(screenImage, // 要画的图片
0, // 目标矩形的第一个角的x坐标
0, // 目标矩形的第一个角的y坐标
magnifierSize, // 目标矩形的第二个角的x坐标
magnifierSize, // 目标矩形的第二个角的y坐标
locationX + (magnifierSize / 4), // 源矩形的第一个角的x坐标
locationY + (magnifierSize / 4), // 源矩形的第一个角的y坐标
locationX + (magnifierSize / 4 * 3), // 源矩形的第二个角的x坐标
locationY + (magnifierSize / 4 * 3), // 源矩形的第二个角的y坐标
this);
}
}
分享到:
相关推荐
【标题】制作桌面放大镜源码 在计算机领域,"桌面放大镜"是一种常见的辅助工具,它可以帮助用户在屏幕上放大特定区域,对于视力不佳或需要精细查看细节的用户尤其有用。这里的“桌面放大镜源码”指的是实现这种功能...
3. **放大镜(Magnifier)**:放大镜功能可以在屏幕上创建一个可移动的放大区域,帮助用户查看细节,尤其是对于小字体或者微小的图形元素。FSCrossHair.exe可能就是这个软件的放大镜组件,可以提高用户在查看精细...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...
Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字 Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,...
Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字 Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...
Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字 Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,...
案例八 飞行文字 案例九 聚光灯效果 案例十 伸展文 第二章 Java与特效 案例1 火焰招牌 案例2 闪电中的城市 案例3 激光绘画 案例4 水面倒影 案例5 图片放大镜 案例6 浮动的气泡...
跨平台开发工具如Xamarin、React Native和Flutter,让开发者使用一种语言或框架编写可以在多个操作系统上运行的应用程序。 文档编写与API管理: 文档生成工具可以自动生成代码注释文档,便于团队内外理解和使用...
AB是一个使用Umple工具开发的Java应用程序,专为可视化激光腔和增益介质中的光子运动而设计。这个程序提供了一个交互式的平台,使用户能够理解激光物理学中的关键概念,如光子在激光器内部的行为以及增益介质如何...
7. 放大效果:实现点击或悬停饼图切片时的放大效果,可以创建一个新的SVG元素作为放大镜,通过改变其位置和缩放比例,突出显示选中的部分。 8. 鼠标交互:添加鼠标事件监听器,如`mouseover`和`click`,以触发动画...
15、Android类似于放大镜源码 共一个目标文件,简单!只是设置文件显示大小!~ 16、Android平台下的手机管理软件源代码 共11个目标文件! 内容索引:Java源码,Android,Android,文件管理 Android平台下的手机系统...
16. 在 Word 的预览窗口中,鼠标指针变为放大镜,可以进行放大/缩小操作。 17. 网页重定向功能可通过 Response 对象的 Redirect 方法实现。 18. Java 中,SequenceInputStream 类可以把多个 InputStream 合并为一...
10. Word的预览窗口中,可以使用放大/缩小功能,鼠标指针变为放大镜,描述是正确的。 11. 给出的Python程序尝试将用户输入转换为列表并反转,但如果没有输入列表会抛出异常。由于输入的是"1,2,3",不是一个有效的...
常见的缩放图标通常表现为一个放大镜,其中一个方向上有加号(+)表示放大,另一个方向上有减号(-)表示缩小。这些图标使用户能轻松地在全局视图和局部视图之间切换。 2. **平移图标**:平移功能允许用户在不改变地图...