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 中。