`

Swing 实现截图小软件 (五)

阅读更多

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

 

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

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

 

 

先来看第一个功能:

 

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

 

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

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

 即可。

 

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


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

 

提示类代码:

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);
	}
}

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


我们需要监听的 键 是  "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" 键了。


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

 

最后运行结果:

 


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

  • 大小: 257.4 KB
  • 大小: 7 KB
  • 大小: 6.7 KB
  • 大小: 21.4 KB
分享到:
评论
1 楼 hk8082 2011-03-31  
很强大,收藏慢慢学习

相关推荐

Global site tag (gtag.js) - Google Analytics