日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 创建桌面宠物

發(fā)布時間:2024/1/1 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 创建桌面宠物 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

QQ寵物終于因?yàn)橥婕蚁∩俣鴴斓袅? 但是想一想還有點(diǎn)懷念(其實(shí)早就棄了) 再加上追了近三年, 數(shù)碼寶貝tri 也算就此完結(jié)了, 再一次勾起了童年, 以及.....我為毛不能自己養(yǎng)數(shù)碼寶貝呢(手動滑稽)

由于大學(xué)狗(天天在宿舍打游戲的那種)一枚, 所以本宅也就只會一點(diǎn)java Swing ,也就只能從此下手了

參考文章在這里

大概內(nèi)容是用swing 的JLabel來加載 圖片,通過線程來改變JLabel中的圖片來實(shí)現(xiàn)動畫,以及相關(guān)屬性的配置

?

代碼部分相對比較簡單

// 創(chuàng)建并設(shè)置窗口JFrame frame = new JFrame("digimonDesktopBaby");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 框體透明frame.setUndecorated(true); // 取消窗口標(biāo)題欄frame.setBackground(new Color(0,0,0,0));// 背景透明//設(shè)置位置并顯示在最前端frame.setBounds(first_x,first_y,0,0);frame.setAlwaysOnTop(true);//設(shè)置取消窗體任務(wù)欄圖標(biāo)frame.setType(JFrame.Type.UTILITY);//設(shè)置托盤圖標(biāo)setTray(frame); // 添加圖片JLabelJLabel digimonLabel = MainFrame.loadPicture(0,0);MainFrame.animateNormal(digimonLabel);frame.getContentPane().add(digimonLabel); // 添加移動事件frame.addMouseListener(new MouseAdapter() {@Overridepublic void mousePressed(MouseEvent e) {// 當(dāng)鼠標(biāo)按下的時候獲得窗口當(dāng)前的位置origin.x = e.getX();origin.y = e.getY();}// @Override // public void mouseClicked(MouseEvent e) { // evolut(frame,digimonLabel); // }});frame.addMouseMotionListener(new MouseMotionAdapter() {// 拖動(mouseDragged 指的不是鼠標(biāo)在窗口中移動,而是用鼠標(biāo)拖動)public void mouseDragged(MouseEvent e) {// 當(dāng)鼠標(biāo)拖動時獲取窗口當(dāng)前位置Point p = frame.getLocation();// 設(shè)置窗口的位置// 窗口當(dāng)前的位置 + 鼠標(biāo)當(dāng)前在窗口的位置 - 鼠標(biāo)按下的時候在窗口的位置int x = p.x + e.getX() - origin.x;int y = p.y + e.getY()- origin.y;frame.setLocation(x, y);FileUtil.updateFile(configPath,configName,"pox",""+x);FileUtil.updateFile(configPath,configName,"poy",""+y);}});//設(shè)置托盤菜單private static void setTray(JFrame frame) {if (SystemTray.isSupported()) {// 判斷系統(tǒng)是否支持系統(tǒng)托盤SystemTray tray = SystemTray.getSystemTray(); // 獲取當(dāng)前系統(tǒng)的托盤// 為托盤添加一個右鍵彈出菜單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);// 設(shè)置托盤圖標(biāo)ImageIcon icon = new ImageIcon(publicUrl + "trayIcon.png");Image image = icon.getImage().getScaledInstance(icon.getIconWidth(), icon.getIconHeight(), Image.SCALE_DEFAULT);TrayIcon trayIcon = new TrayIcon(image, "桌面寵物", popMenu);trayIcon.setImageAutoSize(true); // 自適應(yīng)尺寸,這個屬性至關(guān)重要try {tray.add(trayIcon);} catch (AWTException e1) {e1.printStackTrace();}}}

以上部分是創(chuàng)建好窗體并設(shè)置相關(guān)信息以及綁定拖動事件

備注的應(yīng)該還算詳細(xì)

大概思路是?

創(chuàng)建Jframe -> 設(shè)置相關(guān)屬相 -> 添加托盤菜單 -> 創(chuàng)建顯示圖片用的JLabel -> 設(shè)置相應(yīng)屬性并添加到JFrame

->JLabel綁定拖動事件

其中 animateNormal() 方法是新開一個線程讓桌面上的寵物做出日常動作, 眨眨眼,打個哈欠等等 , 由于ps并不是太厲害,所以本宅的滾球獸暫時只能眨眨眼(不會截GIF)

嗯, 大概就是這樣了 ?其中可添加的東西還很多, 以后隨緣更新好了(手動滑稽)

(鳴人式教學(xué))

?

/*************************************************************************************************/

更新

18/8/3

/*************************************************************************************************/

?

幾天下來又把代碼整理了一下, 將整個程序分割成了兩大部分: 顯示部分和寵物對象

顯示部分只負(fù)責(zé)顯示及響應(yīng)事件, 寵物對象負(fù)責(zé)相關(guān)屬性的設(shè)置

/****** 顯示用窗口類 ********/ public class MainFrame {//初始化private static void createAndShowGUI() { // 創(chuàng)建并設(shè)置窗口frame = new JFrame("digimonDesktopPet");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 框體透明frame.setUndecorated(true); // 取消窗口標(biāo)題欄frame.setBackground(new Color(0,0,0,0));// 背景透明//設(shè)置位置并顯示在最前端frame.setBounds(first_x,first_y,0,0);frame.setAlwaysOnTop(true);//設(shè)置取消窗體任務(wù)欄圖標(biāo)frame.setType(JFrame.Type.UTILITY);//設(shè)置托盤圖標(biāo)setTray();//添加顯示用的JLabellabel = new JLabel();frame.getContentPane().add(label); // 添加移動事件frame.addMouseListener(new MouseAdapter() {@Overridepublic void mousePressed(MouseEvent e) {// 當(dāng)鼠標(biāo)按下的時候獲得窗口當(dāng)前的位置origin.x = e.getX();origin.y = e.getY();}// @Override // public void mouseClicked(MouseEvent e) { // digimon.startEat(); // }});frame.addMouseMotionListener(new MouseMotionAdapter() {// 拖動(mouseDragged 指的不是鼠標(biāo)在窗口中移動,而是用鼠標(biāo)拖動)public void mouseDragged(MouseEvent e) {// 當(dāng)鼠標(biāo)拖動時獲取窗口當(dāng)前位置Point p = frame.getLocation();// 設(shè)置窗口的位置// 窗口當(dāng)前的位置 + 鼠標(biāo)當(dāng)前在窗口的位置 - 鼠標(biāo)按下的時候在窗口的位置int x = p.x + e.getX() - origin.x;int y = p.y + e.getY()- origin.y;frame.setLocation(x, y);更新配置文件FileUtil.updateFile(configPath,configName,"pox","" + x);FileUtil.updateFile(configPath,configName,"poy","" + y);}}); // 拖動文件路過JFrame時 // 張嘴/********** 添加監(jiān)聽器 DragSourceListener** 作用是拖動文件到窗體上而沒松開左鍵*******/ // 拖動文件到JFrame時 // 刪除文件 假裝是被吃掉并播放相應(yīng)動畫new DropTarget(frame, DnDConstants.ACTION_MOVE, new DropTargetAdapter(){public void drop(DropTargetDropEvent dtde){//暫停常規(guī)動畫播放并開始播放刪除文件的相應(yīng)動畫FileUtil.deleteFile(dtde);digimon.startEat();}});// 顯示frame.pack();frame.setVisible(true);}//設(shè)置托盤菜單private static void setTray() {if (SystemTray.isSupported()) {// 判斷系統(tǒng)是否支持系統(tǒng)托盤SystemTray tray = SystemTray.getSystemTray(); // 獲取當(dāng)前系統(tǒng)的托盤// 為托盤添加一個右鍵彈出菜單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);// 設(shè)置托盤圖標(biāo)ImageIcon icon = new ImageIcon("res/icon/trayIcon.png");Image image = icon.getImage().getScaledInstance(icon.getIconWidth(), icon.getIconHeight(), Image.SCALE_DEFAULT);TrayIcon trayIcon = new TrayIcon(image, "桌面寵物", popMenu);trayIcon.setImageAutoSize(true); // 自適應(yīng)尺寸,這個屬性至關(guān)重要try {tray.add(trayIcon);} catch (AWTException e1) {e1.printStackTrace();}}}public static void main(String[] args) {// 顯示應(yīng)用 GUI 窗口javax.swing.SwingUtilities.invokeLater(new Runnable() {@Overridepublic void run() {createAndShowGUI();digimon = new Digimon();digimon.setName("滾球獸");digimon.setLabel(label);digimon.setFrame(frame);digimon.startNormal();}});}// 全局變量,表示窗口初始位置private static int first_x = 1100;private static int first_y = 300;// 全局的位置變量,用于表示鼠標(biāo)在窗口上的位置private static Point origin = new Point();//配置文件路徑及名稱private static String configPath = "config";private static String configName = "config.txt";private static Digimon digimon;private static JFrame frame;private static JLabel label; }

其實(shí)和最開始代碼類似, 只是稍作整理并沒有太大變化

而寵物對象也是

//數(shù)碼獸基類 public class Digimon {private String name; //名字 // public String level; //等級 // public String type; //類型 // public String attribute;//屬性 // public int size; //動作圖數(shù)public void setLabel(JLabel label) {this.label = label;}public void setFrame(JFrame frame) {this.frame = frame;}@Overridepublic String toString() {return "Digimon{" +"name='" + name + '\'' + // ", level='" + level + '\'' + // ", type='" + type + '\'' + // ", attribute='" + attribute + '\'' + // ", size=" + size +", pox=" + pox +", poy=" + poy +'}';}public int getPoy() {return poy;}public void setPoy(int poy) {this.poy = poy;}public int getPox() {return pox;}public void setPox(int pox) {this.pox = pox;}private void init(){// 初始化默認(rèn)顯示的圖片String normalPath = imgPath + this.getName()+"/normal.png";AnimateUtil.changeJLabelImg(frame,label,new ImageIcon(normalPath));}public Digimon(String name, String level, String type, String attribute) {this.name = name; // this.level = level; // this.type = type; // this.attribute = attribute;}public Digimon() {this.name = "unname"; // this.level = "幼年期"; // this.type = "undefind"; // this.attribute = "unknown";}public String getName() {return name;}public void setName(String name) {this.name = name;}// public int getSize() { // return size; // } // // public void setSize(int size) { // this.size = size; // } // public String getLevel() { // return level; // } // // public void setLevel(String level) { // this.level = level; // } // // public String getType() { // return type; // } // // public void setType(String type) { // this.type = type; // }// public String getAttribute() { // return attribute; // } // // public void setAttribute(String attribute) { // this.attribute = attribute; // }//行為//進(jìn)化public Digimon evolut(){return this;}//動作//常規(guī)private void normal(){init(); // 默認(rèn)動作ImageIcon[] icon = new ImageIcon[5];int index =0;for(int i = 1; i < 6;i++){String path = imgPath + this.getName()+"/zhayan ("+ i +").png";icon[index++] = new ImageIcon(path);}normalThread = AnimateUtil.animate(frame,label,icon,500);}public void startNormal() {if(normalThread == null){normal();}normalThread.flag = true;AnimateUtil.playTimer(normalThread).start();}public void stopNormal(int n) {normalThread.flag = false;}//eatprivate void eat(){ // 初始化默認(rèn)顯示的圖片String normalPath = imgPath + this.getName()+"/normal.png";AnimateUtil.changeJLabelImg(frame,label,new ImageIcon(normalPath)); // 默認(rèn)動作ImageIcon[] icon = new ImageIcon[7];int index =0;for(int i = 1; i < 8;i++){String path = imgPath + this.getName()+"/eat"+ i +".png";icon[index++] = new ImageIcon(path);}eatThread = AnimateUtil.animate(frame,label,icon,1000);}public void startEat(){stopNormal(2000);if(eatThread == null){System.out.println("建立eat動畫線程");eat();}eatThread.flag = true;AnimateUtil.playNTimes(eatThread,2,this).start();eatThread.flag = false;}private static Behave normalThread = null;private static Behave eatThread = null;private int pox;private int poy;private JLabel label = null;private JFrame frame = null;private final static String imgPath = "res/img/";private final static String configPath = "config";private final static String configName = "config.txt"; }

? ? ? ? 顯示動畫的方式就是通過開子線程來控制JLabel更換圖片, 以上的實(shí)現(xiàn)方法感覺在邏輯上有些混亂, 剛開始想的是 寫一個線程類,從開始一直運(yùn)行, 有一個startActivity(Thread thread) 之類的方法來顯示某種動作的動畫thread ,但是有點(diǎn)懵, 寫的是將所有動作在第一次實(shí)現(xiàn)時創(chuàng)建好,并通過flag;來控制顯示與否(應(yīng)該很占資源), 就先這樣吧 = =

?

?

--------------------分--------------割--------------線-----------

沒想到吧? 我又要更新了

程序因?yàn)橹匮b系統(tǒng)忘記備份, 所以, 你懂的.....()神煩)

但是, 也有一些感想吧, 一年前P都不懂還敢寫文章(笑)

現(xiàn)在來看, 如果是為了自己做一個桌面寵物玩的話, 除了java Swing , 基于H5一套的Electron好像是更好的選擇具體情況靜候我下次更新(手動滑稽)

總結(jié)

以上是生活随笔為你收集整理的java 创建桌面宠物的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。