JAVA实现屏幕截取

之前在网上看到有前辈做了一个仿QQ截屏的项目,所以自己也想写写试试。


只是想实现功能,就没怎么做界面。


本来想做一个快捷键截屏或者快捷键跳出主界面,但是查了资料后发现好像要用到什么系统钩子,还有下载jar包,所以想先写博客总结,之后再研究那些。


没有什么太高深的知识……主要是swing、绘图、监听之类。


但是有几个细节。


主界面上我只放了一个JLabel和一个JButton,然后添加监听事件。

想让JLabel多行显示,所以一开始试着用‘\n’来换行,结果是它根本不鸟我……

想到托管C++的窗体设计器可以用一个属性控制Label是否可以多行,所以想java swing是否有个方法来设置,结果是没找到。

百度后大都说JLabel不行换行,正要放弃的时候看到一位前辈说可以用html控制JLabel换行。

我试了一下后,果然可以,只要在字符串前后加上“<html>”和“<html/>”标签,就可以在中间写html代码,java会识别。


屏幕的截取用到Robot类和Toolkit类,都只是调用方法。

截取的图用一个截图窗口显示,这个窗口setUndecorated(true);用来隐藏边框,然后重载其paint方法,把截取的图显示在窗口上。

点击按钮后开始截图,但是由于主窗口隐藏需要一定时间,为了防止主窗口还没完全隐藏就截图了,在截图前先Thread.sleep(500);



没有选择选区的时候,会显示一条跟随鼠标的提示,跟随鼠标用了监听器,显示则是用到重载的paint函数将相应的背景矩形和字符串画出来就好。


点击并拖动时只要以初始点为矩形原点,当前位置与初始点的x,y距离为宽和高画矩形就好,需要注意的是,当前位置的x和y可以比初始的小,这样算出来的宽和高就是负数,这个时候就需要设置当前点为矩形的x,y,并且把负数的宽和高变为正的。


在选区的八个点上绘制八个小矩形做定位点,可以点击并拖动以改变选区大小。

刚开始以为调整选区是最难的,可能要弄上几天,没想到其实和刚选择选区的时候差不多,看来算法和几何学得还是太差……

改变选区的时候和刚开始选择选区的时候差不多,只是点击四条边上的点并拖动的时候,矩形的宽或高不变,注意一下就好。八个定位矩形用一个数组,注意不要弄混每个点。


想写一个在系统托盘显示图片的程序,所以百度了一下方法,也只是调用API。

不过设置图片的图片的时候要注意。

首先是路径要注意不要写错,因为如果写错了,并不会报异常,所以我一开始半天都不知道是路径写错了,图标是出现在了托盘,但一片空白。

项目中的路径最好用相对路径,而不用绝对路径。这是方便移植。

相对路径就常用到class.getResource这个方法,可以根据某个类的路径来查某个文件。注意这里返回的是URL(或者是URI?记不清了),即使getPath,返回的字符串前面会带“file:”之类的东西,如果直接当图片的路径会出问题……要用File做中介。

如果图片过大,会只显示左上角一部分,而不会自动拉伸(压缩)。所以我确定路径无误之后还是一片空白,我就郁闷了……后来才知道这点,于是用到了Image的getScaledInstance方法来获取小图版本,当然也可以事先在PS什么的里面修改一下大小……


重载paint函数的时候要注意,如果重载版本没有调用super的paint,窗体上的控件就不会显示出来……这个细节也让我郁闷了好一会。


将图片放到剪切板,百度了一下,又是调用API,这里要用到一个Transferable,由于它是接口,所以要自己操作接口并实现它的三个方法,我用到了内部类。


然后是文件的存储,由于要筛选不同类型的文件,所以用到了FileFilter,同样,因为是抽象类,需要继承被实现其方法。

存储文件的时候,对文件名要注意,可能用户输入了后缀,也可能没输入后缀,没输入后缀的话就要补上。

但我感觉这里总没处理好,暂时没想到好的方法。


完成截图后,截图窗口只是隐藏,并不dispose,因为可以重复利用……这是不是叫单例模式……




其实都是在调用API以及处理一下小细节,真正应该学习到的是编程思想。之前学长说我一个小程序滥用静态变量,不便于维护,当时还不知所以,前几天断网了,想试着拓展一下那个程序,真感觉某些静态变量让我十分痛苦……有时为了方便,又习惯了面向过程的编程,就简单地用静态变量,孰不知,滥用是会造成难以维护等麻烦的。


项目代码:http://download.csdn.net/download/yuseiblack/9956993

好像最少都只能设置一个积分……等级太低么

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值