<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Java的SystemTray類的使用方法

    Java的SystemTray類的使用方法

    JDK1.6版增加了java.awt.SystemTray類,該類表示桌面的系統托盤,這對大多數系統托盤應用已經足夠。如果這個類還是不能滿足您的需求,可以試一試JDIC (JDesktop Integration Components)。
    JDK1.6的API文檔,給出了這個類的用法。有人愿意把創建系統托盤的代碼直接放在主應用代碼中,筆者更傾向于把創建系統托盤的責任分派給一個單獨的類,這符合類的設計原則。在主應用中直接調用該類的工廠方法就可以了,結構清晰,便于維護,改動或增加系統托盤的功能,不必改動主應用代碼。
    創建系統托盤的類(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);
            }
    }

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

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

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

    public class MainApp {
            private static void createAndShowGUI() {
                    JFrame mainFrame = new JFrame("測試主窗體");
                    JLabel jLabel = new JLabel("這是一個標簽", 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();
                                    }
        });
               
    }

    為簡單起見,可以把TrayFactory.java和MainApp.java放在同一目錄下,把icon.png文件放在當前目錄的images目錄下。

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

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


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    <2013年1月>
    303112345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    導航

    統計

    常用鏈接

    留言簿

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 人人狠狠综合久久亚洲88| 久久精品国产精品亚洲| 亚洲美女视频网址| 一区二区三区四区免费视频 | 亚洲av无码成人精品区在线播放| 亚洲 日韩 色 图网站| 毛片免费全部免费观看| 亚洲中文字幕一二三四区| 日本一道本高清免费| 免费人成网站永久| 亚洲精品无码久久久久去q | 四虎最新永久免费视频| 亚洲国产福利精品一区二区| 日本亚洲免费无线码| 亚洲综合小说另类图片动图| 国产成人免费a在线资源| 永久免费无码网站在线观看个| 亚洲第一区在线观看| 成人爽a毛片免费| 亚洲色欲或者高潮影院| 毛片a级毛片免费播放100| 国产精品亚洲а∨无码播放不卡| 亚洲国产午夜中文字幕精品黄网站 | 国产一精品一AV一免费孕妇| 亚洲日韩一区精品射精| www亚洲一级视频com| 日本黄色动图免费在线观看| 亚洲日产2021三区| 又粗又硬又大又爽免费视频播放| 国产精品成人啪精品视频免费| 亚洲AV无码成人网站久久精品大| 蜜臀98精品国产免费观看| 亚洲av无码专区在线观看亚| 国产精品亚洲产品一区二区三区| 99久久精品免费精品国产| 日韩亚洲国产综合高清| 国产亚洲精品免费视频播放 | 99国产精品视频免费观看| 亚洲精品理论电影在线观看| 国产gv天堂亚洲国产gv刚刚碰| 3d成人免费动漫在线观看|