生活随笔
收集整理的這篇文章主要介紹了
java桌面宠物swing实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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实现的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。