欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Swing 实现截图小软件 (五)

程序员文章站 2024-01-31 12:46:28
...

应大家的要求, 继续完善截图小软件。 这次增加两个功能:

 

1. 鼠标截图时,直接复制到系统剪贴板,同时增加一个 在屏幕中维持两秒钟的 复制完成提示。

2. 增加键盘 "Print Screen" 键的监听,直接启动截图。

 

 

先来看第一个功能:

 

a. 截图时,直接复制到系统剪贴板

 

这个比较简单,直接在 ScreenWindow 类的 mouseRelease() 方法中,增加一句:

//将图片保存到系统剪贴板
GraphicsUtils.setClipboardImage(image);

 即可。

 

b. 增加个 能在屏幕中维持两秒钟的 问题提示。  效果如图:


Swing 实现截图小软件 (五)

要让此提示在系统屏幕中间,出现且两秒钟后,消失。

 

提示类代码:

package prx.swing.snapshoot;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;

import javax.swing.JDialog;
import javax.swing.JPanel;

import com.sun.awt.AWTUtilities;

/**
 * 屏幕提示文字工具类
 * @author pengranxiang
 */
public class ScreenTip {
	//以对话框形式出现,防止在系统任务栏出现一个窗口最小化时的图标
	private static JDialog frame = new JDialog();
	
	static {
		frame.setAlwaysOnTop(true);	//设置对话框为 顶层窗口
        frame.setUndecorated(true);	//取消对话口的窗口框
        frame.setSize(300, 100);	
        frame.setLocationRelativeTo(null);	//居中
        AWTUtilities.setWindowOpaque(frame, false);	// 设置对话框为透明。 此方法需要 JDK6 以上

        //显示文字用的容器
        final JPanel pane = new JPanel() {
        	/**
			 * 
			 */
			private static final long serialVersionUID = 1L;

			//在容器中绘制提示文字
			protected void paintComponent(Graphics g) {
        		super.paintComponent(g);
        		
        		g.setColor(Color.RED);
        		g.setFont(new Font("宋体", Font.BOLD, 20));
        		g.drawString("贴图已复制到系统剪贴板", 10, 50);
        		
        	}
        };
        
        //设置容器最适应大小
        pane.setPreferredSize(new Dimension(frame.getWidth(), frame.getHeight()));
        //设置容器为透明
        pane.setOpaque(false);

        frame.setLayout(new BorderLayout());
        frame.add(pane);
        
        
        
	}

	public static void showTip() {
		Thread thread;
		
		thread = new Thread(new Runnable() {
        	public void run() {
        		frame.setVisible(true);
        		try {
					Thread.sleep(1500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
        		frame.setVisible(false);
        	}
        });
		thread.start();
	}
	
	public static void main(String[] args) {
		ScreenTip.showTip();
	}
}
 

 运行上面代码,即可出现  --- 在屏幕显示提示文字 两秒钟。   上面的程序,文字消失后,程序没有退出哦, 记得退出。

 

那么在刚才的代码中,复制到剪贴板后,增加一句:

ScreenTip.showTip();

 即可出现提示。

 

 

再来看第二个功能:监听键盘的 PrintScreen 键

 

这个比较麻烦, 先来做个小实验:

 

代码如下:

package prx.swing.snapshoot;

import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class Test {
	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(400, 100);
		frame.setLocationRelativeTo(null);
		frame.setResizable(false);
		
		JLabel label = new JLabel("The PrintScreenKey Code: ");
		JLabel codeLabel = new JLabel(KeyEvent.VK_PRINTSCREEN + "");
		
		JLabel label2 = new JLabel("You Pressed Key Code: ");
		final JLabel codeLabel2 = new JLabel();
		
		frame.setLayout(new GridLayout(2, 2));
		frame.add(label);
		frame.add(codeLabel);
		frame.add(label2);
		frame.add(codeLabel2);
		
		frame.addKeyListener(new KeyListener() {

			public void keyPressed(KeyEvent e) {
				codeLabel2.setText(e.getKeyCode() + "");
			}

			public void keyReleased(KeyEvent e) {
				// TODO Auto-generated method stub
				
			}

			public void keyTyped(KeyEvent e) {
				// TODO Auto-generated method stub
				
			}
			
		});
		
		frame.setVisible(true);
	}
}

 这个是键盘监听测试。 运行上面的代码,如图:


Swing 实现截图小软件 (五)

我们需要监听的 键 是  "PrintScreen/SysRq" 其键盘代码为 : 154

 

第二行为当前我们监听键盘按下的键的代码。

 

测试中会发现: 键盘中所有的键,除了 "Tab"  和 "PrintScreen" 这两个键,其他的都能监听。

 

所以使用 KeyListener 是无法监听  “PrintScreen”键的。

 

 

于是在这里卡住了。 翻了N久 的资料后, 发现可以通过 Toolkit 的

 

addAWTEventListener(AWTEventListener listener, long eventMask)

 

来接受键盘事件。于是改变方案为:

package prx.swing.snapshoot;

import java.awt.AWTEvent;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.AWTEventListener;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Test {
	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(400, 100);
		frame.setLocationRelativeTo(null);
		frame.setResizable(false);
		
		JLabel label = new JLabel("The PrintScreenKey Code: ");
		JLabel codeLabel = new JLabel(KeyEvent.VK_PRINTSCREEN + "");
		
		JLabel label2 = new JLabel("You Pressed Key Code: ");
		final JLabel codeLabel2 = new JLabel();
		
		frame.setLayout(new GridLayout(2, 2));
		frame.add(label);
		frame.add(codeLabel);
		frame.add(label2);
		frame.add(codeLabel2);
		
		Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
            public void eventDispatched(AWTEvent ae) {
                if (ae instanceof KeyEvent) {
                    KeyEvent e = (KeyEvent) ae;  
                    if(e.getKeyCode() != 0)  codeLabel2.setText(e.getKeyCode() + "");
                }
            }
        }, AWTEvent.KEY_EVENT_MASK);
		
		frame.setVisible(true);
	}
}
 

这次可以顺利监听 "PrintScreen" 和 "Tab" 键了。


Swing 实现截图小软件 (五)

既然 “PrintScreen”的监听搞定了, 那在 监听中直接调用 截图方法即可。

 

最后运行结果:

 


Swing 实现截图小软件 (五)

完成代码中附件: SnapShoot.jar 中。