Java写的屏幕放大镜

来源:互联网 发布:买外文原版书网站 知乎 编辑:程序博客网 时间:2024/04/28 05:26
写了个放大镜,初步对Java的GUI编程有了点概念:-)


/**
 * 文件名: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(00, 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
    );
    }
}

 
效果如下:
原创粉丝点击