Java的SystemTray類的使用方法

          Java的SystemTray類的使用方法

          JDK1.6版增加了java.awt.SystemTray類,該類表示桌面的系統(tǒng)托盤(pán),這對(duì)大多數(shù)系統(tǒng)托盤(pán)應(yīng)用已經(jīng)足夠。如果這個(gè)類還是不能滿足您的需求,可以試一試JDIC (JDesktop Integration Components)。
          JDK1.6的API文檔,給出了這個(gè)類的用法。有人愿意把創(chuàng)建系統(tǒng)托盤(pán)的代碼直接放在主應(yīng)用代碼中,筆者更傾向于把創(chuàng)建系統(tǒng)托盤(pán)的責(zé)任分派給一個(gè)單獨(dú)的類,這符合類的設(shè)計(jì)原則。在主應(yīng)用中直接調(diào)用該類的工廠方法就可以了,結(jié)構(gòu)清晰,便于維護(hù),改動(dòng)或增加系統(tǒng)托盤(pán)的功能,不必改動(dòng)主應(yīng)用代碼。
          創(chuàng)建系統(tǒng)托盤(pán)的類(TrayFactory.java)的代碼如下:

          //package com.jnmc.liang.systemtray;

          import java.awt.*;
          import java.awt.event.*;

          public class TrayFactory {
                  private TrayIcon trayIcon = null;
                  private Component comp = null;
                  private String trayImageName = null;
                  private String tooltip = null;
                  
                  private TrayFactory(Component comp, String trayImageName, String tooltip) {
                          this.comp = comp;
                          this.trayImageName = trayImageName;
                          this.tooltip = tooltip;
                          
                          init();
                  }
                  
                  private void init() {
                          if (SystemTray.isSupported()) {
                                  SystemTray tray = SystemTray.getSystemTray();
                                  Image image  = Toolkit.getDefaultToolkit().getImage(trayImageName);
                                  PopupMenu popupMenu = new PopupMenu();
                                  MenuItem restoreItem = new MenuItem("還原"); 
                                  MenuItem exitItem  = new MenuItem("退出");
                                  
                                  restoreItem.addActionListener(new RestoreItemActionListener());                        
                                  exitItem.addActionListener(new ExitItemActionListener());
                                  
                                  popupMenu.add(restoreItem);
                                  popupMenu.addSeparator();
                                  popupMenu.add(exitItem);
                                  
                                  trayIcon = new TrayIcon(image, tooltip,  popupMenu);
                                  trayIcon.addMouseListener(new TrayIconMouseListener());
                                  //trayIcon.addActionListener(new TrayIconActionListener());
                                                          
                                  try {
                                          tray.add(trayIcon);
                                  }
                                  catch (AWTException e) {
                                          System.err.println(e);
                                  }
                          }
                          else {
                                  //..........
                          }
                  }

                  private class RestoreItemActionListener implements ActionListener {
                          public void actionPerformed(ActionEvent ae) {
                                  comp.setVisible(true);
                          }
                  }
                          
                  private class ExitItemActionListener implements ActionListener {
                          public void actionPerformed(ActionEvent ae) {
                                  System.exit(0);
                          }
                  }
                  
                  private class TrayIconMouseListener extends MouseAdapter {
                          public void mousePressed(MouseEvent me) {
                                  if (me.getButton() == MouseEvent.BUTTON1) {
                                          comp.setVisible(true);
                                  }
                          }
                  }

                  public static void createTray(Component comp, String trayImageName, String tooltip) {
                          new TrayFactory(comp, trayImageName, tooltip);
                  }
          }

          這個(gè)類的構(gòu)造方法是private的,因?yàn)閯?chuàng)建該類的實(shí)例不是我們的目的,另一方面是為了方便系統(tǒng)托盤(pán)的創(chuàng)建。
          構(gòu)造方法有3個(gè)參數(shù):
          第1個(gè)參數(shù)是一個(gè)Component,這就是您所要顯示或隱藏的主窗體。當(dāng)然,您把這個(gè)參數(shù)寫(xiě)成Component的子類也無(wú)妨,這里是為了增加類的通用性。
          第2個(gè)參數(shù)是一個(gè)String,它是一個(gè)image文件的名稱,將來(lái)用這個(gè)文件創(chuàng)建托盤(pán)圖標(biāo)TrayIcon。
          第3個(gè)參數(shù)也是一個(gè)String,它是工具提示字符串,當(dāng)您把鼠標(biāo)放到托盤(pán)圖標(biāo)上的時(shí)候,托盤(pán)圖標(biāo)將彈出這個(gè)字符串的內(nèi)容。
          創(chuàng)建系統(tǒng)托盤(pán)的具體代碼在方法private void init()中。
          創(chuàng)建系統(tǒng)托盤(pán)的任務(wù)分為兩個(gè)步驟:
          首先創(chuàng)建托盤(pán)圖標(biāo)(TrayIcon),其次把托盤(pán)圖標(biāo)添加到系統(tǒng)托盤(pán)(SystemTray)中。
          Java.awt.TrayIcon提供3種構(gòu)造方法創(chuàng)建TrayIcon實(shí)例,這里采用第三種構(gòu)造方法:
                          trayIcon = new TrayIcon(image, tooltip,  popupMenu);
          其中,image對(duì)象由TrayFactory類構(gòu)造方法的第二個(gè)參數(shù)trayImageName創(chuàng)建:
          Image image  = Toolkit.getDefaultToolkit().getImage(trayImageName);
          tooltip就是TrayFactory類構(gòu)造方法的第三個(gè)參數(shù)
          由于不能朝前引用,PopupMenu對(duì)象popupMenu必須在創(chuàng)建trayIcon對(duì)象之前創(chuàng)建,并給popup菜單項(xiàng)添加動(dòng)作監(jiān)聽(tīng)器來(lái)處理菜單項(xiàng)的動(dòng)作(點(diǎn)擊)事件,由于處理動(dòng)作事件比較簡(jiǎn)單,這里不做具體分析,只對(duì)TrayIcon的鼠標(biāo)事件做出說(shuō)明。
          我們希望在托盤(pán)圖標(biāo)上按下鼠標(biāo)左鍵時(shí)顯示主窗體,所以必須處理托盤(pán)圖標(biāo)的鼠標(biāo)按下事件。我們用TrayIconMouseListener私有內(nèi)部類(private inner class)來(lái)處理鼠標(biāo)按下事件。不論按下鼠標(biāo)左鍵還是右鍵,都會(huì)產(chǎn)生鼠標(biāo)事件,都會(huì)引起mousePressed方法的調(diào)用,所以在這個(gè)方法中只處理左鍵而忽略右鍵,把右鍵留給popup菜單:
                                  if (me.getButton() == MouseEvent.BUTTON1) {
                                          comp.setVisible(true);
                                  }
          這時(shí),就可以給init()方法中創(chuàng)建的TrayIcon對(duì)象trayIcon添加鼠標(biāo)監(jiān)聽(tīng)器了:
          trayIcon.addMouseListener(new TrayIconMouseListener());
          利用TrayFactory類對(duì)主應(yīng)用創(chuàng)建系統(tǒng)托盤(pán)時(shí),只需在主應(yīng)用中調(diào)用該類的工廠方法即可:
          TrayFactory.createTray(comp, trayImageName, tooltip);
          注意這一句,一定要放在適當(dāng)?shù)奈恢茫褐鲬?yīng)用從開(kāi)始啟動(dòng)到啟動(dòng)完畢,必須有機(jī)會(huì)執(zhí)行這一句。所以建議把這一句放在主應(yīng)用的構(gòu)造方法中,或者干脆放在顯示主窗體的前一個(gè)語(yǔ)句的位置:

          //其他語(yǔ)句
                         JFrame mainFrame = new JFrame("測(cè)試主窗體");
                          mainFrame.getContentPane().add(otherVisibleObj, BorderLayout.CENTER);
                          mainFrame.pack();
                          TrayFactory.createTray(mainFrame, "images/icon.png", "這是工具提示");        
                          mainFrame.setVisible(true);
          下面給出一個(gè)完整的例子。
          主應(yīng)用(MainApp.java)源代碼如下:

          import java.awt.*;
          import javax.swing.*;

          public class MainApp {
                  private static void createAndShowGUI() {
                          JFrame mainFrame = new JFrame("測(cè)試主窗體");
                          JLabel jLabel = new JLabel("這是一個(gè)標(biāo)簽", SwingConstants.CENTER);
                          jLabel.setPreferredSize(new Dimension(400, 300));
              mainFrame.getContentPane().add(jLabel, BorderLayout.CENTER);
              
                          mainFrame.pack();
                          TrayFactory.createTray(mainFrame, "images/icon.png", "你好,Java!\nHello,Java!");
                          mainFrame.setVisible(true);
                  }
              
                  public static void main(String[] args) {
                          String lf = UIManager.getSystemLookAndFeelClassName();
                          try {
                                  UIManager.setLookAndFeel(lf);
                          } 
                          catch(Exception e) {
                          }
                          
                          javax.swing.SwingUtilities.invokeLater(new Runnable() {
                                          public void run() {
                                                  createAndShowGUI();
                                          }
              });
                     
          }

          為簡(jiǎn)單起見(jiàn),可以把TrayFactory.java和MainApp.java放在同一目錄下,把icon.png文件放在當(dāng)前目錄的images目錄下。

          ===
          from
          http://blog.sina.com.cn/s/blog_a5f093b401018ss1.html

          posted on 2013-01-13 09:27 DolveVita 閱讀(270) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          <2013年1月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 女性| 松阳县| 肥城市| 四川省| 祁东县| 永宁县| 庄河市| 镇赉县| 呼玛县| 兰溪市| 三明市| 潜江市| 宁远县| 垫江县| 吴旗县| 房产| 正安县| 绿春县| 衡东县| 连江县| 长治县| 苍梧县| 密山市| 城步| 阳信县| 台湾省| 鄢陵县| 布尔津县| 鲁甸县| 孟连| 广丰县| 武宣县| 鄂伦春自治旗| 新乡市| 金沙县| 吴堡县| 宁强县| 阿克苏市| 绍兴市| 东台市| 南阳市|