JAVA桌面宠物

osc_bjmmswh6 2021-01-21 11:53:23
java


忄辰桌面宠物【静态】

最近寒假刚刚开始,然后时间很多,就想做一款桌面宠物,但是本人能力有限,只能做个静态的,其实我觉得静态也挺好看的是吧QAQ,想做动态的话可以参考链接2,用线程就可以实现了
感谢大佬的这两片文章: 连接1.连接2

第一步

我们需要有一个背景透明化的图片,我是用PS的,也是第一次用,如果大佬有更好的办法可以帮助一下我。。。
首先我们需要准备一张图片
比如进击的巨人 (三笠)百度找的图
图片是网上找的
然后打开我们的PS应用,打开这张图片
在这里插入图片描述
选择这个魔法棒,点击空白处键盘上的delete
效果如下
在这里插入图片描述
然后我们就可以得到一张背景透明化的图片了啊哈哈
可以调整一下大小,按照你们想要的来调整就OK









第二步

我们现在就开始写代码,写的比较乱,见谅,这里有的是直接搬运链接的代码,如果想要学习可以去原链接看
主函数

//创建一个JFrame
JFrame frame=new JFrame("桌面宠物");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//框体透明
frame.setUndecorated(true);//取消标题栏
frame.setBackground(new Color(0,0,0,0));//背景透明
//增加托盘图标
setTray(frame);
//设置位置并显示在最前端
frame.setAlwaysOnTop(true);
//设置取消窗体任务栏图标
frame.setType(JFrame.Type.UTILITY);
frame.setVisible(true);
frame.setSize(200,200);
frame.setLocation(1670,20);
//运行时间
jishiqi();
//全局位置变量,用于鼠标在窗口上的位置
Point origin = new Point();
//添加图标信息
JLabel label=new JLabel();
ImageIcon icon=new ImageIcon("tupian\\三笠.png");
int chongwuwidth=icon.getIconWidth();
int chongwuheight=icon.getIconHeight();
icon.setImage(icon.getImage().getScaledInstance(chongwuwidth, chongwuheight, Image.SCALE_AREA_AVERAGING));
label.setBounds(frame.getX(), frame.getY(), chongwuwidth, chongwuheight);
label.setIcon(icon);
frame.add(label);
//添加窗体监听器
frame.addMouseListener(new MouseAdapter() {

// 按下(mousePressed 不是点击,而是鼠标被按下没有抬起)
public void mousePressed(MouseEvent e)
{

origin.x=e.getX();
origin.y=e.getY();
}
public void mouseClicked(MouseEvent e)
{

if(e.getButton()==MouseEvent.BUTTON3)
setable(frame,e.getComponent(),e.getX(),e.getY(),label);
}
});
frame.addMouseMotionListener(new MouseMotionListener() {

@Override
public void mouseMoved(MouseEvent e) {

// TODO 自动生成的方法存根 
}
@Override
public void mouseDragged(MouseEvent e) {

Point p=frame.getLocation();
// 窗口当前的位置 + 鼠标当前在窗口的位置 - 鼠标按下的时候在窗口的位置
frame.setLocation(p.x+e.getX()-origin.x,p.y+e.getY()-origin.y);
}
});
frame.validate();
}

托盘,可以将你的桌宠图标放在托盘图标里面
在这里插入图片描述
代码如下

private static void setTray(JFrame frame)
{

if(SystemTray.isSupported())//判断系统是否支持系统托盘
{

SystemTray tray=SystemTray.getSystemTray();//获取当前系统的托盘
//为托盘添加一个右键弹出式菜单
PopupMenu menu=new PopupMenu();
MenuItem openItem=new MenuItem("打开");
openItem.addActionListener(e->frame.setVisible(true));
MenuItem closeItem=new MenuItem("最小化");
closeItem.addActionListener(e->frame.setVisible(false));
MenuItem exItem=new MenuItem("退出");
exItem.addActionListener(e->System.exit(0));
menu.add(openItem);
menu.addSeparator();
menu.add(closeItem);
menu.addSeparator();
menu.add(exItem);
ImageIcon icon=new ImageIcon("tupian\\可爱.png");
Image image=icon.getImage().getScaledInstance(icon.getIconWidth(), icon.getIconHeight(),Image.SCALE_DEFAULT);
TrayIcon trayIcon=new TrayIcon(image,"桌面宠物", menu);
trayIcon.setImageAutoSize(true);//自适应尺寸*很重要
try {

tray.add(trayIcon);
} catch (AWTException e1) {

// TODO 自动生成的 catch 块
e1.printStackTrace();
}
}
}

计时器,可以统计你的桌宠累计在线时长
在这里插入图片描述
代码如下

public static void jishiqi()
{

int time=60000;
ActionListener jishi=new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {

try {

RandomAccessFile raf=new RandomAccessFile("time.txt","rw");
int times=Integer.parseInt(raf.readLine())+1;
raf.seek(0);
raf.write((times+"").getBytes());
raf.close();
} catch (NumberFormatException | IOException e1) {

// TODO 自动生成的 catch 块
e1.printStackTrace();
}
}
};
new javax.swing.Timer(time,jishi).start();
}

弹出式菜单,当你鼠标右键点击宠物时,会有关于宠物属性,宠物设置,宠物选择等
在这里插入图片描述
代码如下

public static void setable(JFrame frame,Component b,int x,int y,JLabel label)
{

JPopupMenu menu=new JPopupMenu();
JMenuItem shuxingItem=new JMenuItem("宠物设置");
shuxingItem.addActionListener(e->set());
JMenuItem selectItem=new JMenuItem("宠物属性");
selectItem.addActionListener(e->{

try {

able();
} catch (IOException e1) {

// TODO 自动生成的 catch 块
e1.printStackTrace();
}
});
JMenuItem setItem=new JMenuItem("宠物选择");
setItem.addActionListener(e->select(frame,label));
JMenuItem qqItem=new JMenuItem("联系作者");
qqItem.addActionListener(e->JOptionPane.showMessageDialog(null,"相逢何必曾相识","联系作者",1));
menu.add(shuxingItem);
menu.addSeparator();
menu.add(selectItem);
menu.addSeparator();
menu.add(setItem);
menu.addSeparator();
menu.add(qqItem);
menu.show(b, x, y);
}

宠物属性面板
在这里插入图片描述
代码如下

public static JFrame able() throws IOException
{

//宠物属性变量
RandomAccessFile raf=new RandomAccessFile("time.txt","rw");
int time=Integer.parseInt(raf.readLine());
raf.close();
int level;
if(time<60)
level=1;
else if(time>=60&&time<=200)
level=2;
else if(time>200&&time<=500)
level=3;
else if(time>500&&time<=100)
level=4;
else
level=5;
BufferedReader bufferedReader=new BufferedReader(new FileReader("name.txt"));
String chongwunameString="";
String zhurennameString="";
String string="";
while((string=bufferedReader.readLine())!=null)
{

chongwunameString=string;
zhurennameString=bufferedReader.readLine();
}
bufferedReader.close();
//宠物属性面板
JFrame frame=new JFrame("宠物属性");
frame.setSize(400,300);
frame.setLocationRelativeTo(null);
frame.setLayout(null);
frame.setResizable(false);
frame.setVisible(true);
JPanel panel=new JPanel();
panel.setLayout(new FlowLayout(FlowLayout.LEFT,30,20));
JLabel label=new JLabel("宠物名字: "+chongwunameString);
JLabel label2=new JLabel("主人名字: "+zhurennameString);
JLabel label3=new JLabel("等级: lv "+level+" ");
JLabel label4=new JLabel("累计在线时长: "+time+"分钟");
panel.add(label3);
panel.add(label);
panel.add(label2);
panel.add(label4);
panel.setBounds(0, 0,200, 300);
frame.add(panel);
frame.validate();
return frame;
}

宠物设置面板
在这里插入图片描述
代码如下

public static JFrame set()
{

//宠物设置面板
JFrame frame=new JFrame("宠物设置");
frame.setSize(250,250);
frame.setLocationRelativeTo(null);
frame.setLayout(null);
frame.setResizable(false);
frame.setVisible(true);
JPanel panel=new JPanel();
panel.setLayout(new FlowLayout(FlowLayout.LEFT,5,10));
panel.setBounds(0, 0, 250,150);
JLabel label=new JLabel("宠物名字:");
JLabel label2=new JLabel("主人名字:");
JTextField jTextField=new JTextField(20);
JTextField jTextField2=new JTextField(20);
panel.add(label);
panel.add(jTextField);
panel.add(label2);
panel.add(jTextField2);
frame.add(panel);
JButton button=new JButton("确认设置");
button.setBounds(75, 165, 100,30);
frame.add(button);
button.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {

try {

FileWriter fileWriter=new FileWriter("name.txt");
fileWriter.write(jTextField.getText()+"\n");
fileWriter.write(jTextField2.getText());
fileWriter.close();
JOptionPane.showMessageDialog(null,"设置完成","设置",1);
frame.setVisible(false);
} catch (IOException e1) {

// TODO 自动生成的 catch 块
e1.printStackTrace();
}
}
});
return frame;
}

宠物选择面板
在这里插入图片描述
代码如下

public static void select(JFrame frame,JLabel label)
{

//宠物选择面板
JFrame frame2=new JFrame("宠物选择");
frame2.setSize(450,300);
frame2.setLocationRelativeTo(null);
frame2.setLayout(null);
frame2.setResizable(false);
frame2.setVisible(true);
JPanel panel=new JPanel();
panel.setLayout(new FlowLayout(FlowLayout.LEFT));
JLabel label2=new JLabel(" 古风汉服");
ImageIcon icon=new ImageIcon("tupian\\古风汉服.png");
JLabel label3=new JLabel();
icon.setImage(icon.getImage().getScaledInstance(icon.getIconWidth(),icon.getIconHeight(),Image.SCALE_DEFAULT));
label3.setIcon(icon);
panel.add(label2);
panel.add(label3);
panel.setBounds(0, 0, 200,190);
frame2.add(panel);
JPanel panel2=new JPanel();
panel.setLayout(new FlowLayout(FlowLayout.LEFT));
JLabel nameLabel=new JLabel(" 薇尔莉特");
ImageIcon icon2=new ImageIcon("tupian\\人类精灵.png");
JLabel iconLabel=new JLabel();
icon.setImage(icon.getImage().getScaledInstance(icon2.getIconWidth(), icon2.getIconHeight(), Image.SCALE_DEFAULT));
iconLabel.setIcon(icon2);
panel2.add(nameLabel);
panel2.add(iconLabel);
panel2.setBounds(225, 0, 200, 190);
frame2.add(panel2);
ButtonGroup buttonGroup=new ButtonGroup();
JRadioButton gufengbut=new JRadioButton();
JRadioButton jinglingbut=new JRadioButton();
gufengbut.setBounds(85, 200, 40, 40);
jinglingbut.setBounds(325, 200, 40, 40);
buttonGroup.add(jinglingbut);
buttonGroup.add(gufengbut);
frame2.add(gufengbut);
frame2.add(jinglingbut);
Button button=new Button("选择");
button.setBounds(160, 230, 100, 40);
frame2.add(button);
button.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {

if(gufengbut.isSelected())
{

selectchongwu(frame, label, "tupian\\微笑.png");
frame2.setVisible(false);
}
if(jinglingbut.isSelected())
{

selectchongwu(frame, label, "tupian\\薇尔莉特.png");
frame2.setVisible(false);
}
}
});
frame2.validate();
}

这个是宠物的替换函数

public static void selectchongwu(JFrame frame,JLabel label,String nameString)
{

ImageIcon icon=new ImageIcon(nameString);
int chongwuwidth=icon.getIconWidth();
int chongwuheight=icon.getIconHeight();
icon.setImage(icon.getImage().getScaledInstance(chongwuwidth, chongwuheight, Image.SCALE_AREA_AVERAGING));
label.setIcon(icon);
}

第三步

就是欣赏我家三笠美貌了
在这里插入图片描述
这些大家都可以改,我学的不是很好,希望可以被大佬指教出来问题
完。


版权声明
本文为[osc_bjmmswh6]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4396834/blog/4917465

  1. 【计算机网络 12(1),尚学堂马士兵Java视频教程
  2. 【程序猿历程,史上最全的Java面试题集锦在这里
  3. 【程序猿历程(1),Javaweb视频教程百度云
  4. Notes on MySQL 45 lectures (1-7)
  5. [computer network 12 (1), Shang Xuetang Ma soldier java video tutorial
  6. The most complete collection of Java interview questions in history is here
  7. [process of program ape (1), JavaWeb video tutorial, baidu cloud
  8. Notes on MySQL 45 lectures (1-7)
  9. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  10. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  11. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  12. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  13. 【递归,Java传智播客笔记
  14. [recursion, Java intelligence podcast notes
  15. [adhere to painting for 386 days] the beginning of spring of 24 solar terms
  16. K8S系列第八篇(Service、EndPoints以及高可用kubeadm部署)
  17. K8s Series Part 8 (service, endpoints and high availability kubeadm deployment)
  18. 【重识 HTML (3),350道Java面试真题分享
  19. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  20. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  21. [re recognize HTML (3) and share 350 real Java interview questions
  22. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  23. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  24. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  25. RPC 1: how to develop RPC framework from scratch
  26. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  27. RPC 1: how to develop RPC framework from scratch
  28. 一次性捋清楚吧,对乱糟糟的,Spring事务扩展机制
  29. 一文彻底弄懂如何选择抽象类还是接口,连续四年百度Java岗必问面试题
  30. Redis常用命令
  31. 一双拖鞋引发的血案,狂神说Java系列笔记
  32. 一、mysql基础安装
  33. 一位程序员的独白:尽管我一生坎坷,Java框架面试基础
  34. Clear it all at once. For the messy, spring transaction extension mechanism
  35. A thorough understanding of how to choose abstract classes or interfaces, baidu Java post must ask interview questions for four consecutive years
  36. Redis common commands
  37. A pair of slippers triggered the murder, crazy God said java series notes
  38. 1、 MySQL basic installation
  39. Monologue of a programmer: despite my ups and downs in my life, Java framework is the foundation of interview
  40. 【大厂面试】三面三问Spring循环依赖,请一定要把这篇看完(建议收藏)
  41. 一线互联网企业中,springboot入门项目
  42. 一篇文带你入门SSM框架Spring开发,帮你快速拿Offer
  43. 【面试资料】Java全集、微服务、大数据、数据结构与算法、机器学习知识最全总结,283页pdf
  44. 【leetcode刷题】24.数组中重复的数字——Java版
  45. 【leetcode刷题】23.对称二叉树——Java版
  46. 【leetcode刷题】22.二叉树的中序遍历——Java版
  47. 【leetcode刷题】21.三数之和——Java版
  48. 【leetcode刷题】20.最长回文子串——Java版
  49. 【leetcode刷题】19.回文链表——Java版
  50. 【leetcode刷题】18.反转链表——Java版
  51. 【leetcode刷题】17.相交链表——Java&python版
  52. 【leetcode刷题】16.环形链表——Java版
  53. 【leetcode刷题】15.汉明距离——Java版
  54. 【leetcode刷题】14.找到所有数组中消失的数字——Java版
  55. 【leetcode刷题】13.比特位计数——Java版
  56. oracle控制用户权限命令
  57. 三年Java开发,继阿里,鲁班二期Java架构师
  58. Oracle必须要启动的服务
  59. 万字长文!深入剖析HashMap,Java基础笔试题大全带答案
  60. 一问Kafka就心慌?我却凭着这份,图灵学院vip课程百度云