java桌面宠物swing实现

在bilibili上看到一个少前小人的桌面程序
但他是Python写的。
于是就打算自己写一个java的

csdn上也有不少的桌面宠物程序,也给我提供了很好的参考

利用swing的图片替换实现动画效果
参考文档
https://blog.csdn.net/JunyAn_Cyw/article/details/81346875
https://blog.csdn.net/Shenpibaipao/article/details/78704714
完整代码

package teacher_silence.com.gitee;import javax.swing.*;
import java.awt.*;import java.awt.dnd.*;
import java.awt.event.*;public class TestBody {private static JFrame frame;private static JLabel jLabel;Thread test=new Thread(new Def());
//    Thread test2=new Thread(new Cli());int flag1=1;//动作转换判断标志
//    boolean flag2=true;public TestBody(){frame = new JFrame("digimonDesktopPet");//设置随机位置并显示在最前端frame.setLocation( (int)( Math.random()*100),(int)(Math.random()*100));//注意int强转时后面的括号也药带上frame.setAlwaysOnTop(true);
//        窗体sizeframe.setSize(200, 200);
//        样式frame.getContentPane().setLayout(null);frame.setTitle("测试动画");frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);frame.setType(JFrame.Type.UTILITY);// 动画的承载体setTray();jLabel = new JLabel();// 初始化第一张图cgJLabelImg(jLabel,"res/default/skeleton-standing0.png");frame.add(jLabel);
//        体透明frame.setUndecorated(true); // 取消窗口标题栏frame.setBackground(new Color(0,0,0,0));// 背景frame.setVisible(true);Point origin = new Point();frame.addMouseListener(new MouseAdapter() {@Overridepublic void mousePressed(MouseEvent e) {// 当鼠标按下的时候获得窗口当前的位置origin.x = e.getX();origin.y = e.getY();flag1=2;
//                try {
//                    test.sleep(1000 * 60 * 60);
//                }catch (InterruptedException E){
//
//                }
//                test2.start();
//                flag1=false;
//                flag2=true;
//                try{
//                    test.wait();
//                }catch (InterruptedException m){
//
//                }
//            }
//            @Override
//            public void mouseClicked(MouseEvent e) {
//                Digimon.startEat();}public void mouseEntered(MouseEvent e){flag1=3;}public void mouseExited(MouseEvent e){flag1=1;}public void mouseReleased(MouseEvent e){flag1=1;}});frame.addMouseMotionListener(new MouseMotionAdapter() {// 拖动(mouseDragged 指的不是鼠标在窗口中移动,而是用鼠标拖动)public void mouseDragged(MouseEvent e) {// 当鼠标拖动时获取窗口当前位置
//                test2.start();Point p = frame.getLocation();// 设置窗口的位置// 窗口当前的位置 + 鼠标当前在窗口的位置 - 鼠标按下的时候在窗口的位置int x = p.x + e.getX() - origin.x;int y = p.y + e.getY()- origin.y;frame.setLocation(x, y);
//                flag1=true;
//                try {
//                    test2.sleep(1000 * 60 * 60);
//                }catch (InterruptedException r){
//
//                }
//                test.interrupt();更新配置文件
//                FileUtil.updateFile(configPath,configName,"pox","" + x);
//                FileUtil.updateFile(configPath,configName,"poy","" + y);}});// 动画线程test.start();//test2.start();//构造结束}class Def implements Runnable{@Overridepublic void run() {int i = 1;try {while (true) {Thread.sleep(50);if(flag1==1)cgJLabelImg(jLabel, "res/default/skeleton-standing" + i++ + ".png");else if (flag1==2)cgJLabelImg(jLabel, "res/clickTwo/skeleton-playing" + i++ + ".png");elsecgJLabelImg(jLabel, "res/grabed/skeleton-grabed" + i++ + ".png");if (i > 60) i = 1;}} catch (Exception e) {e.printStackTrace();}}}//    class Cli implements Runnable{
//        @Override
//        public void run() {try{test.wait();}catch (InterruptedException e){}
//            int i = 1;
//            try {
//                while (flag2) {
//                    Thread.sleep(50);
//                    cgJLabelImg(jLabel, "res/clickTwo/skeleton-playing" + i++ + ".png");
//                    if (i > 60) i = 1;
//                }
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//        }
//    }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);}private void setTray() {if (SystemTray.isSupported()) {// 判断系统是否支持系统托盘SystemTray tray = SystemTray.getSystemTray(); // 获取当前系统的托盘// 为托盘添加一个右键弹出菜单PopupMenu popMenu = new PopupMenu();MenuItem itemOpen = new MenuItem("打开");itemOpen.addActionListener(e -> frame.setVisible(true));MenuItem itemHide = new MenuItem("隐藏");itemHide.addActionListener(e -> frame.setVisible(false));MenuItem itemExit = new MenuItem("退出");itemExit.addActionListener(e -> System.exit(0));popMenu.add(itemOpen);popMenu.add(itemHide);popMenu.add(itemExit);// 设置托盘图标ImageIcon icon = new ImageIcon("girl1.png");Image image = icon.getImage().getScaledInstance(icon.getIconWidth(), icon.getIconHeight(), Image.SCALE_DEFAULT);TrayIcon trayIcon = new TrayIcon(image, "烧钱宠物", popMenu);trayIcon.setImageAutoSize(true); // 自适应尺寸,这个属性至关重要try {tray.add(trayIcon);} catch (AWTException e1) {e1.printStackTrace();}}}public static void main(String[] args){new TestBody();}
}

工程文件下载
https://gitee.com/teacher_silence/teacher_silence_workshop
里面的windowspet.zip

项目运行结果图

一开始是想开两个线程,一个负责默认,一个负责拖动的样式,后来发现复杂,还不好实现,后来直接用一个线程,再利用一个flag来判断是什么状态。这样就简单很多。

java桌面宠物swing实现相关推荐

  1. 记录java桌面程序swing布局的痛心

    最近需要做一些桌面程序,因为我比较擅长的语言是java,php:只能选择java来做,于是先仿照一些桌面程序来布局练下手,下面就是代码记录了,讲真过程有点痛苦,一度的想换javafx,但是群里朋友说, ...

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

    >我将要做一个什么? 也算是突发奇想,以前一直用C#写的桌面应用,但最近有点沉迷JAVA,加上最近不小心打开了阔别十来年的QQ宠物(现在QQ宠物Client已经变得都是广告了),想起了瑞星小狮子 ...

  3. java 创建桌面宠物

    QQ宠物终于因为玩家稀少而挂掉了, 但是想一想还有点怀念(其实早就弃了) 再加上追了近三年, 数码宝贝tri 也算就此完结了, 再一次勾起了童年, 以及.....我为毛不能自己养数码宝贝呢(手动滑稽) ...

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

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

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

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

  6. 一键搞定Java桌面应用安装部署 —— exe4j + Inno Setup 带着JRE, 8M起飞

    转载自:http://www.blogjava.net/huliqing/archive/2008/04/18/193907.html 对于作Java桌面应用来说,比较烦人的就是安装部署问题,客户端是 ...

  7. java桌面版_长大了Java! 提出Java桌面版

    java桌面版 不,这不是另一个" Java已死"的咆哮. Java非常活跃. 它是可用的最佳开发和运行时平台之一. 迄今为止,最稳定的平台. 那可能只是它最大的祸根. 荒谬! 稳 ...

  8. HTML5崛起之时,Java桌面时代就已经终结了

    来源:AI前线 作者:Steve Hannah 翻译:核子可乐 编辑:燕珊 2004 年 Google Maps 的面世标志着 Java 桌面时代的终结,也改变了桌面环境下"跨平台" ...

  9. python桌面程序打开慢_转 : 终于搞清楚了为什么Java桌面程序总是感觉慢的原因...

    终于搞清楚了为什么Java桌面程序总是感觉慢的原因! 按照道理服务器和浏览器都在用脚本和虚拟机,那些不慢,而Java的桌面程序总是感觉响应迟钝呢?主要有两个原因,一是服务器和浏览器都是异步的,提交到渲 ...

最新文章

  1. 中国信通院发布《区块链基础设施研究报告(2021年)》
  2. windows 下使用caffy_折腾下Windows下的Elasticsearch安装与使用
  3. C++面试题:list和vector有什么区别
  4. oracle 性别默认是男_被实名举报“制造性别对立”的杨笠,到底冤不冤?
  5. ORA-01123:无法启动联机备份;未启用介质恢复(错误分析)
  6. 【Android源码】Activity如何加载布局
  7. et al、e.g.、i.e.读音及释义
  8. python 爬虫 微博 github_GitHub - peanut-shi/weiboSpider: 新浪微博爬虫,用python爬取新浪微博数据...
  9. opencv 读取视频、打开摄像头、写入视频文件
  10. 机器学习 决策树 监督_监督机器学习-决策树分类器简介
  11. 如何快速生成100万不重复的8位随机编号?
  12. 高质量的C/C++编程(2)----程序员必看系列
  13. 从Simulink到PX4——Simulink-PX4插件安装与环境搭建
  14. c语言程序方差的计算公式,方差计算公式
  15. python画一棵树的心理测试,【心理测试】画树测试:一棵树读你的人生
  16. python输入随机的口算算式_excel随机取整函数:如何快速生成低龄口算算式
  17. 常见的的水生植物图像
  18. 查看电脑可支持最大内存容量的方法
  19. 接口测试(二)接口测试用例设计
  20. 【实践】Ceph:创建Cephfs文件

热门文章

  1. 字节跳动-教育职位-高级后端开发面试
  2. dataset访问Oraclel数据库
  3. 2020低压电工操作证考试及低压电工模拟考试软件
  4. 华为路由器访问控制列表ACL配置实例
  5. 第8章 项目进度管理
  6. 认识区块链,认知区块链— —数据上链
  7. 币圈“重启”?大佬回归,矿机脱销,资金盘蠢蠢欲动……
  8. SpringBoot+Vue实现第三方QQ登录(一)
  9. 一种具有肤质保留功能的磨皮算法
  10. 图片大小以及dp和px关系一览表,logo尺寸