生活随笔
收集整理的這篇文章主要介紹了
JAVA桌面宠物
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
忄辰桌面寵物【靜態】+【動態】
最近寒假剛剛開始,然后時間很多,就想做一款桌面寵物,但是本人能力有限,只能做個大概的,其實我覺得做得也挺好看的是吧QAQ,想要詳細做動態的話可以參考鏈接2,我做的比較簡單
感謝大佬的這兩片文章: 連接1.連接2
第一步:制作背景透明化
第二步:功能及代碼【附圖片】
第三步:動態代碼片【附效果圖】
第一步
我們需要有一個背景透明化的圖片,我是用PS的,也是第一次用,如果大佬有更好的辦法可以幫助一下我。。。
首先我們需要準備一張圖片
比如進擊的巨人 (三笠)百度找的圖
然后打開我們的PS應用,打開這張圖片
選擇這個魔法棒,點擊空白處鍵盤上的delete
效果如下
然后我們就可以得到一張背景透明化的圖片了啊哈哈
可以調整一下大小,按照你們想要的來調整就OK
第二步
我們現在就開始寫代碼,寫的比較亂,見諒,這里有的是直接搬運鏈接的代碼,如果想要學習可以去原鏈接看
主函數
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() {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
) {}@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
) {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
) {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
) {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;elselevel
=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
) {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
);
}
第三步
如何做動態的,這又是一個問題,首先我們需要Pr軟件,然后用你想要的GIF圖放進去,第一次用Pr沒人教真的,希望大佬有更高的辦法
如下圖所示
然后我們選擇那個導出幀和下一幀,將GIF變成圖片知道全部把幀變成圖片
然后將得到的圖片背景透明化,參考第一步。重命名為如b1,b2之類的,好進行鏈接,之后開始寫代碼(采用的是鏈接2中的代碼)
new Thread(() -> {int i
=1;try{while (true){Thread
.sleep(200);selectchongwu(frame
, label
,"tupian\\b"+ i
++ +".png");if(i
>29){Thread
.sleep(500);i
=1;}}} catch (Exception e
){e
.printStackTrace();}}).start();
然后我們就會得到一只會動的桌寵,如果你想按左鍵才能動可以添加監聽器等
效果如下
這些大家都可以改,我學的不是很好,希望可以被大佬指教出來問題
完。
總結
以上是生活随笔為你收集整理的JAVA桌面宠物的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。