/**
* 文件名:Magnifier.java
* OS:GNU/Linux Ubuntu 6.10
* IDE:eclipse 3.2
* JDK 版本: 1.6.0
* 版本:0.1
* 作者:88250
* 邮箱&MSN:DL88250@gmail.com
* QQ: 845765
*/
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
);
}
}