`

Swing 实现截图小软件 (六)

阅读更多

既然 sdtm1016 兄 给出新的建议,那我们就继续完善下 SnapShoot

 

按 sdtm1016 兄的需求,这次再增加三个功能:

 

1. 修改文件选择窗口的默认目录为系统桌面,且给定默认文件名。


2. 增加托盘功能,且程序运行时,不自动显示软件窗口。


3. 增加系统热键功能,即:不管程序当前有没有获得焦点,均可以保持键盘快捷键的监听,实现快捷功能。

 

 

功能一: 修改文件选择窗口的默认目录为系统桌面,且给定默认文件名。

 

对于在当前用户的系统桌面目录的取得,Java API 已经有提供了:

//得到当前用户的桌面目录
File desktopDir = FileSystemView.getFileSystemView().getHomeDirectory();

 

那么我们设定文件选择窗口的默认选中文件为  用户桌面目录下的 save.png :

JFileChooser chooser = new JFileChooser();
File selectedFile = new File(FileSystemView.getFileSystemView().getHomeDirectory(), "save.png");
//设置默认选中文件
chooser.setSelectedFile(selectedFile);

 

功能一完成。

 

 

 

功能二:增加托盘功能,且程序运行时,不自动显示软件窗口。

 

在 JDK6.0 中,也提供了对系统托盘的操作。  本例关于加入系统托盘的代码:

/**
 * 加入系统托盘
 */
private void addSystemTray() {
	//修改窗口关闭和最小化事件
	this.addWindowListener(new WindowAdapter() {
		public void windowClosed(WindowEvent e) {
			SnapShoot.this.setVisible(false);
		}
		
		public void windowIconified(WindowEvent e) {
			SnapShoot.this.setVisible(false);
		}
	});
	
	if (SystemTray.isSupported()) {
		
		SystemTray tray = SystemTray.getSystemTray();
		
		// 为这个托盘加一个弹出菜单
		final PopupMenu popup = new PopupMenu();
		MenuItem item = new MenuItem("open  ctrl + shift + o");
		MenuItem exit = new MenuItem("exit");
		popup.add(item);
		popup.add(exit);
		
		item.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				SnapShoot.this.setVisible(true);
			}
		});
		
		exit.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				//清除系统热键
				JIntellitype.getInstance().cleanUp();
				System.exit(1);
			}
		});
		
		// 为这个托盘加一个提示信息
		Image scaleLogo = ((BufferedImage)logo).getScaledInstance(16, 16, Image.SCALE_FAST);
		TrayIcon trayIcon = new TrayIcon(scaleLogo, "屏幕截图小软件: SnapShoot\n作者:pengranxiang", popup);
		
		try {
			tray.add(trayIcon);
		} catch (AWTException e) {
			System.err.println("无法向这个托盘添加新项: " + e);
		}
	} else {
		System.err.println("无法使用系统托盘!");
	}
}
 

运行后的效果:


 

 
 运行时不自动显示软件窗口只需修改 在窗口初始化时 注释掉   this.setVisible(true); 即可:

public SnapShoot() {
	initUI();
	initLayout();
	createAction();
	
	addSystemTray();
	
//	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	this.setIconImage(logo);
	this.setSize(730, 500);
	this.setTitle("SnapShoot");
	this.setFocusable(true);
	this.setLocationRelativeTo(null);	//居中
//	this.setVisible(true);
}

 

 

功能三: 增加系统热键功能,即:不管程序当前有没有获得焦点,均可以保持键盘快捷键的监听,实现快捷功能

 

这个就真的比较难搞啦。  Java AWT & Swing 体系的键盘监听,前提条件是,被监听的组件必须先获得焦点。

 

比如:窗口最小化后,由于此时窗口失去焦点,这时也就监听不到键盘事件,不能响应操作了。

 

要让程序在失去焦点的时候也响应事件操作,能想到的就是 跟QQ一样跟操作系统绑定一个系统热键了。

 

这个功能用 纯Java 是无法实现的。 需要用到  JNI  调用本地方法去绑定系统热键。

 

对于 C++ 我是很久没搞了。 忘差不多了。幸运的是,我在网上找到了一个  绑定系统热键的 开源项目:JIntellitype

 

项目地址: http://melloware.com/products/jintellitype/index.html

 

该项目对 JNI 操作进行的底层封装。 使用也非常简单, 直接看 她的 Quick Start   的例子就学的差不多了。

 

本例相关代码:

private void addSystemHotKey() {
	JIntellitype.getInstance();  
	
	//检查是否已经有该程序在运行中
	if(JIntellitype.checkInstanceAlreadyRunning("SnapShoot")) {
		System.err.println("An instance of this application is already running");
		System.exit(1);
	}
	
	//注册系统热键为:ctrl + shift + p 截图,ctrl + shift + s 保存,ctrl + shift + o 打开主界面(为了不干扰其他程序的打印和保存快捷键)
	JIntellitype.getInstance().registerHotKey(1, JIntellitype.MOD_CONTROL + JIntellitype.MOD_SHIFT, (int)'P');
	JIntellitype.getInstance().registerHotKey(2, JIntellitype.MOD_CONTROL + JIntellitype.MOD_SHIFT, (int)'S');
	JIntellitype.getInstance().registerHotKey(3, JIntellitype.MOD_CONTROL + JIntellitype.MOD_SHIFT, (int)'O');
	
	JIntellitype.getInstance().addHotKeyListener(new HotkeyListener() {
		public void onHotKey(int identifier) {
			if(identifier == 1) {
				printScreen();
			} else if(identifier == 2) {
				save();
			} else if(identifier == 3) {
				SnapShoot.this.setVisible(true);
			}
		}
	});
}

 

这样这三个功能就完成了。

 

同时增加了 软件小图标;

将主界面中的 截图Button 响应修改为:不隐藏主界面。

想要隐藏主界面截图,直接最小化到托盘后,使用热键 Ctrl + Shift + P 即可。

 

软件提供三个热键:

Ctrl + Shift + P   截图

Ctrl + Shift + S   保存

Ctrl + Shift + O   打开主界面

 

退出软件 请  右击托盘图标,选择“exit"

 

 

由于软件用到了 JNI , 所以需要两个 DLL  文件支持。 

 

直接运行请下载 附件:SnapShoot.zip 解压后,在SnapShoot 文件夹中双击  SnapShoot.jar

 

注意:软件运行,由于没有自动显示软件主界面,所以只会在系统托盘部分,增加一个图标。 看到图标后,就可使用热键了。

 

项目源码在附件:SnapShoot.jar

 

  • 大小: 4.8 KB
  • 大小: 15.5 KB
分享到:
评论
13 楼 ssjlongtou 2012-03-31  
不错啊,能做撤销吗?一个一个删除画出来的线条和字体
12 楼 chengguochang 2011-10-24  
老大 你加了dll之后再MAC OS下就不能用了
11 楼 duronshi 2011-05-16  
可以参考QQ2010之前版本的截图(只有一个DLL,名字好像是Camera.dll),提供了3中调用方法:截取当前画面、根据一个窗口进行截取、另一个不记得了,可以根据你的需求进行封装(DLL、OCX、EXE)。如果想在客户端运行是不是还要在客户端安装JDK?
10 楼 zxlmmmm 2011-05-13  
界面在美化一点更好了,希望楼主加油
9 楼 kisslips 2011-05-09  
支持快捷键 !!!!谢楼主了!!!!
8 楼 sidac 2011-03-05  
Java能做很多的事了,不过桌面应用还是有点吃力,支持一下楼主
7 楼 beykery 2011-03-05  
楼主给力!托盘要不要添加几个菜单项啊?
6 楼 cclsw07 2011-03-04  
对程序员来说,界面就是浮云~~~
5 楼 抓挖鸟 2011-03-04  
功能要强大,界面要绚丽,楼猪要给力啊!
4 楼 nishijia 2011-03-04  
应该有个清除截图的按钮,要是截错屏了,或者不想要现在的截屏,只好重新关掉了
3 楼 txlaijava 2011-03-04  
希望换个图标. 简单明了.
2 楼 darwintest 2011-03-04  
高手,支持一下
1 楼 sdtm1016 2011-03-02  
  

相关推荐

    Swing 实现截图小软件 (五)

    NULL 博文链接:https://pengranxiang.iteye.com/blog/935433

    swing实现的仿qq截图小工具

    本项目是使用Swing实现的一个仿QQ截图小工具,它旨在提供类似QQ截图的功能,让用户在桌面环境中能够方便地进行屏幕截图并进行编辑。 首先,Swing组件库提供了丰富的组件,如JFrame、JButton、JPanel等,这些组件...

    java swing 截屏软件实现

    以下是对这个"java swing 截屏软件实现"的详细知识点解析: 1. **Swing组件**: Swing提供了一套丰富的组件库,如JFrame、JButton、JLabel等,用于构建用户界面。在这个截屏软件中,可能会用到JFrame作为主窗口,...

    java swing 实现的带启动界面的简易截图软件

    java swing 实现的带启动界面的简易截图软件,启动界面有进度条,可保存可粘贴到qq微信,简单实用

    java swing实现pdf阅读器

    总的来说,用Java Swing实现一个PDF阅读器是一个涉及多方面技能的任务,包括对PDF格式的理解、Java GUI编程、IO操作以及第三方库的熟练使用。通过不断学习和实践,可以构建出功能强大且用户友好的PDF阅读器。

    java swing实现学生住宿管理系统(源码)

    java swing实现学生住宿管理系统(源码) java swing实现学生住宿管理系统(源码) java swing实现学生住宿管理系统(源码) java swing实现学生住宿管理系统(源码) java swing实现学生住宿管理系统(源码) java ...

    Swing小管理项目源码

    【Swing小管理项目源码】是一个基于Java Swing开发的桌面应用程序示例,它涵盖了多个核心功能,包括用户界面的设计、数据操作以及交互逻辑。Swing是Java的标准库,用于构建图形用户界面(GUI),提供了丰富的组件库...

    使用Java Swing实现了抖音上的表白程序

    最后,作者想说的是,1.9块钱的资源,你买不了吃亏,买不了上当,只需省一片绿箭口香糖的钱,你就能拥有一个用于整蛊的Java Swing实现,你在玩的过程中,还可以初步了解一些Java Swing的知识,如此说来,少年,抓紧时间下载吧。

    javaswing实现贪吃蛇源码

    java贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇...

    Java基于Swing实现的简单聊天室,支持多人在线闲谈.zip

    这个“Java基于Swing实现的简单聊天室,支持多人在线闲谈.zip”文件是一个示例项目,展示了如何利用Swing构建一个基本的多用户聊天应用。下面将详细阐述其涉及的关键知识点。 1. **Swing组件**:Swing提供了丰富的...

    基于Java Swing实现的日历记事本系统【源码+报告文档】

    本项目是一套基于Java Swing实现的日历记事本系统,主要针对计算机相关专业的正在学习java的学生与需要项目实战练习的Java学习者。 包含:项目源码、报告文档等。 项目都经过严格调试,确保可以运行! 该系统功能...

    JAVA Swing 实现商品列表,数量加减 ,删除整行 Demo

    在这个特定的Demo中,我们关注的是如何使用Swing来实现一个商品列表,其中包含商品的数量加减功能以及整行删除的功能。这个功能通常在电商应用或者库存管理软件中会用到。 首先,我们需要了解`JTable`,这是Swing中...

    java swing写的聊天软件

    本项目"java swing写的聊天软件"利用了Swing组件来设计和实现了一个能够支持多达1000个用户同时在线的聊天应用。以下是关于这个聊天软件的关键知识点和实现细节: 1. **Swing组件库**:Swing 提供了丰富的组件,如...

    基于Java swing组件实现简易计算器

    8. Java swing组件的使用:Java swing组件可以用于创建各种图形化用户界面,例如计算器、游戏、聊天软件等。 9. 计算器的实现:计算器是Java swing组件中的一种常见应用,通过使用JFrame、JButton、JPanel、...

    java小游戏 (源码)swing五子棋源代码

    java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源...

    Swing写的一个简易记事小软件

    标题中的“Swing写的一个简易记事小软件”指的是使用Java Swing库开发的一款简单应用程序,主要用于记录日常事项。Swing是Java提供的一种图形用户界面(GUI)工具包,它允许开发者创建桌面应用,包括窗口、按钮、...

    java 截屏 swing

    "java 截屏 swing"这个主题涉及到的是如何利用Swing来实现屏幕截图功能。在这个项目中,开发人员创建了一个应用程序,允许用户选择屏幕上的任意矩形区域进行截图,未被选中的部分会显示为阴影效果,同时支持拖动和...

    java swing做的通讯录软件连接sql

    【Java Swing制作的通讯录软件与SQL数据库连接】 在编程领域,Java Swing 是一个用于创建图形用户界面(GUI)的工具包,它提供了丰富的组件和功能,使得开发者能够构建出功能完善的桌面应用。本项目是一个基于Java ...

    Java swing实现的一款餐厅点餐系统

    本项目是一套Java swing实现的一款餐厅点餐系统,主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目可以直接作为bishe使用。 项目都经过严格调试,...

    java swing mysql实现的酒店管理系统项目源码_swing_JavaSwing_酒店管理系统_

    Java Swing MySQL实现的酒店管理系统项目源码是一款基于Java图形用户界面(GUI)库Swing和关系型数据库管理系统MySQL开发的应用程序。此系统旨在为酒店提供一套全面的后台管理解决方案,涵盖了酒店日常运营中的核心...

Global site tag (gtag.js) - Google Analytics