>我将要做一个什么?

也算是突发奇想,以前一直用C#写的桌面应用,但最近有点沉迷JAVA,加上最近不小心打开了阔别十来年的QQ宠物(现在QQ宠物Client已经变得都是广告了),想起了瑞星小狮子,有点怀旧,就想找找有没有简单、干净一些的桌面宠物养成游戏软件,写代码的时候趴在窗口上卖卖萌也是甚好的。

找了找,还真有。在Github上找到了一个日本人写的开源桌面宠物项目:https://github.com/nonowarn/shimeji4mac。然而不幸的是,作者似乎也很久不开发了,且这个东西是明确标明需要JRE6-32bit才能运行。在JRE9都出来了的今天,为了这么个宠物专门去寻找、并安装一个JRE6,不合适吧;况且这玩意现在也不算很好找了,哪怕是在oracle官网找JRE6的下载地址都要找不少时间。于是就手痒,想自己写一个。

我会尽量不使用除了JDK自带的jar以外的东西,并随缘更新这个系列。由于我不是很喜欢写xml,因此主要将用Swing来进行开发。

>JAVA的运行问题

刚刚提到了Shimoji桌面宠物需要JRE6才能运行的问题,那我现在用JRE,换个没有JRE环境的电脑不就不能运行了?

啊,确实是这样的,不过我们有办法规避这个问题,让你的jar伪装成一个exe,像c#写的桌面应用一样到处跑:http://blog.csdn.net/shenpibaipao/article/details/78701034

>今天的目标

今天的目标是,既然是桌面宠物,那么它一定是能动的。所以我们先从如何解决桌面宠物的动画问题解决起。

下面是完成后的效果演示:(素材取自Undertale贴吧)

>核心问题

核心问题主要有两个:

  • 如何加载图片?
  • 如何让图片动起来?

先说第一个问题:如何加载图片。

在Swing中,我习惯用一个JLabel去加载图片:

 public JLabel loadPicture(int x,int y,String url){JLabel jLabel = new JLabel();ImageIcon icon = new ImageIcon(url);int picWidth = icon.getIconWidth(),pinHeight = icon.getIconHeight();icon.setImage(icon.getImage().getScaledInstance(picWidth,pinHeight,Image.SCALE_DEFAULT));jLabel.setBounds(x,y,picWidth,pinHeight);jLabel.setIcon(icon);return jLabel;}

上面这段代码会返回一个加载了图片的JLabel,其左上角位置相对于父容器为(x,y)。

要让它动起来,我们需要准备一条连续的图片素材:(图片素材和项目Demo代码我会放到最后供下载使用)


    其次,我们专门运行一个新的线程,通过sleep的方法去更换帧。这样效率虽然不高,但我们并不是在写什么大工程,作为一个桌面宠物,足矣。

现在,我们修改刚刚加载图片的方法,把它变成一个给指定JLabel更换新图片的方法:

 private void cgJLabelImg(JLabel jLabel,String imgUrl){ImageIcon icon = new ImageIcon(imgUrl);int picWidth = icon.getIconWidth(),pinHeight = icon.getIconHeight();icon.setImage(icon.getImage().getScaledInstance(picWidth,pinHeight, Image.SCALE_DEFAULT));jLabel.setBounds(0,0,picWidth,pinHeight);jLabel.setIcon(icon);}

假设上面三张素材图片的名字分别为:"a1.png"、"a2.png"、"a3.png",那么专门处理动画帧的线程就可以这么写了:

 // 动画线程 这里用到了JDK8的lambda表达式new Thread(() -> {int i=1;try{while (true){Thread.sleep(250);cgJLabelImg(jLabel,"a"+ i++ +".png");if(i>3)i=1;}} catch (Exception e){e.printStackTrace();}}).start();

我在这里写了个JDK8的Lambda表达式,如果你对这种写法有兴趣,可以看看这里:http://blog.csdn.net/shenpibaipao/article/details/78622456。不过就算不想了解Lambda表达式也没关系,其相当于:

 new Thread(new Runnable() {@Overridepublic void run() {int i=1;try{while (true){Thread.sleep(250);cgJLabelImg(jLabel,"a"+ i++ +".png");if(i>3)i=1;}}catch (Exception e){e.printStackTrace();}}}).start();

现在就可以去运行程序了。然后你会注意到一个问题,由于我们的素材是背景透明的png图片,但承载JLabel的JFrame的背景却是灰色的实体背景,看着就很丑。而且我们其实也不需要标题栏,那么我们可以给JFrame加上两个属性:

 // 框体透明this.setUndecorated(true); // 取消窗口标题栏this.setBackground(new Color(0,0,0,0));// 背景透明

完活,今天的任务就到这里结束了。可以到下面的链接去下载具体的素材和代码自己试试。

>素材及Demo代码下载

CSDN下载:http://download.csdn.net/download/shenpibaipao/10143462

次篇:[JAVA]从零开始的“桌面宠物”之路(二):系统托盘与任务栏

[JAVA]从零开始的“桌面宠物”之路(一):动画效果相关推荐

  1. [JAVA]从零开始的“桌面宠物”之路(二):系统托盘与任务栏

    >今天的目标 在Window系统下,打开QQ宠物,我们并不能再任务栏看到相关的窗口.这也很好理解,毕竟桌面宠物就相当于一个桌面挂件,如果这个挂件侵入到我们的工作区(任务栏),就很烦,也很影响工作 ...

  2. 用java写一个表白神器,要有动画效果

    下面是一个简单的 Java 程序示例,它显示了一个窗口,在窗口中以动画效果显示表白话语. import java.awt.*; import javax.swing.*;public class Lo ...

  3. 用Python写个桌面挂件,手把手带你做只桌面宠物~

    导语 前段时间有小伙伴留言说想让我带大家写写桌面小挂件,今天就满足一下留过类似言的小伙伴的请求呗~不过感觉写桌面的挂历啥的没意思,就简单带大家做一只桌面宠物吧~ 皮卡丘大家喜欢吗~今天就由做个皮卡丘为 ...

  4. python给女友一个小惊喜——桌面宠物【DIY版】

    嗨害大家好鸭!我是小熊猫❤ 这不是小别胜新欢嘛~ 所以懂得都懂~ 这次给她准备了一些小惊喜 做为程序员,我也只会这个啦(●'◡'●) 开发工具 Python版本:3.6.4 相关模块: PyQt5模块 ...

  5. 利用python写个桌面挂件,带大家做只桌面宠物

    转载自品略图书馆 http://www.pinlue.com/article/2020/05/2516/2110606798446.html 导语 前段时间有小伙伴留言说想让我带大家写写桌面小挂件,今 ...

  6. 用Python实现自制桌面宠物,变出一个桌面小挂件

    前言 就喜欢自己自定义一些小玩意,今天就来分享一些制作桌面宠物的素材,还有代码 相关文件 声明:图片素材源于网络,侵歉删. 开发工具 Python版本:3.6.4 相关模块: PyQt5模块: 以及一 ...

  7. python桌面宠物模块_利用python写个桌面挂件 | 手把手带大家做只桌面宠物呗

    导语 前段时间有小伙伴留言说想让我带大家写写桌面小挂件,今天就满足一下留过类似言的小伙伴的请求呗~不过感觉写桌面的挂历啥的没意思,就简单带大家做一只桌面宠物吧~ 废话不多说,让我们愉快地开始吧~ 开发 ...

  8. python桌面宠物_写个桌面挂件 | 手把手带大家做只桌面宠物呗

    原文链接网页链接​mp.weixin.qq.com 效果展示桌面宠物https://www.zhihu.com/video/1230197062286778368 导语 前段时间有小伙伴留言说想让我带 ...

  9. 桌宠必须要java吗_桌宠软件电脑版下载_桌面宠物软件免费版下载_3DM软件

    <桌宠>是一款桌面宠物软件,软件能够让你根据自己的喜好设置一只宠物,然后它会放养在你的桌面上,你要像真实的宠物一样照顾它,饲养喂食,给他治病陪他玩耍,这个过程非常有趣. 软件简介 在网上下 ...

最新文章

  1. IO流(六)之CharArrayReader类与CharArrayWriter类
  2. pyflink的local模式实验记录
  3. java js跳出循环_[Java教程]js循环的总结
  4. ActiveMQ 权限
  5. 操作文件的实用类,删除目录,清空目录,删除文件
  6. MATLAB 高等数学中的应用
  7. 解决华为手机、平板系统没有录屏、不能分享录屏的问题
  8. 部分商誉确认法和全部商誉确认法
  9. Apache DolphinScheduler 2.X保姆级源码解析
  10. 小米路由固件中lua文件反编译
  11. Uri.parse()的各种用法
  12. 5000的游戏电脑计算机配置,5000元电脑配置单,5000游戏电脑配置,直播电脑配置
  13. JS And Vue代码调试——IDEA+JS+vue-devtools-dev+JetBrains IDE Support(Chrome插件)
  14. 天玑9200搭载Arm最新旗舰GPU,性能爆表!支持移动端硬件光追
  15. PDF如何设置注释字体大小
  16. 2021年京东撸货还能做吗?轻松实现利益最大化,新手必看!
  17. 写给程序员儿子的一封信
  18. OSI7层模型数据分层传输的过程
  19. This was likely an oversight when migrating to django.urls.path().
  20. 金三银四!95后阿里P7晒出工资单:狠补了这个,真香...

热门文章

  1. EC-PCA: 利润中心主数据维护流程
  2. configure: error: C++ preprocessor “/lib/cpp“ fails sanity check
  3. 软件开发—钱多多—典型用户分析
  4. AppRTC(WebRTC)服务器搭建
  5. 访问www.baidu.com全过程
  6. 12月更新 - 可能是最好用百度网盘搜索神器
  7. BZOJ2054疯狂的馒头
  8. 高通终端修改nv值后,不重启终端即生效
  9. 关于功放的正确调整及安全匹配音箱方法的计算及说明
  10. Excel 2010 SQL应用083 降序排列