<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

    導航

    統計

    常用鏈接

    留言簿

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 99爱在线精品免费观看| 国产成年无码久久久免费| 免费羞羞视频网站| 亚洲AV无码国产精品色| 成年人视频免费在线观看| 亚洲国产精品乱码在线观看97 | 国产自国产自愉自愉免费24区| 亚洲中文字幕丝袜制服一区| 一区二区免费国产在线观看| 亚洲精品无码你懂的| 妞干网在线免费观看| 福利片免费一区二区三区| 免费a级毛片永久免费| 一级一黄在线观看视频免费| 亚洲人成网站在线播放vr| 久操免费在线观看| 亚洲国产成人资源在线软件| 国产免费av片在线看| 老司机精品视频免费| 国产精一品亚洲二区在线播放| 无码人妻丰满熟妇区免费| 亚洲成a人片在线观看中文app| 毛片在线免费视频| 曰批全过程免费视频观看免费软件| 中文字幕亚洲综合久久男男| 香蕉视频亚洲一级| 伊人亚洲综合青草青草久热| 日韩精品无码专区免费播放| 亚洲综合一区二区三区四区五区| 亚洲黄色免费网站| 国产产在线精品亚洲AAVV| 国产亚洲AV无码AV男人的天堂| 91久久精品国产免费直播| 小说区亚洲自拍另类| 亚洲中文字幕无码永久在线| 日本高清在线免费| 免费人成大片在线观看播放| 亚洲日本一区二区| 四虎精品亚洲一区二区三区| 久久综合给合久久国产免费| 成人婷婷网色偷偷亚洲男人的天堂|