2010年8月25日 星期三

將 Java swing 的 JFrame 縮小至系統托盤上

由於本次專題內會使用到定期更新的功能,必須將系統常駐,但又不可能總是縮小在工作列上,所以這次使用 SystemTray、 TrayIcon ,以及各種觸發事件傾聽來達到縮小至系統托盤上的效果:

public class surface extends JFrame{
      SystemTray systray;   //桌面上的系統托盤
      TrayIcon trayicon;       //本程式在系統托盤上的圖示與功能

      public surface(){
            try{
                  systray=SystemTray.getSystemTray();
                  //獲取系統托盤的實例
                  trayicon=new TrayIcon(ImageIO.read(new File("D:\\login.gif")),"RSS");
                  //建立程式位於系統托盤的樣式
                  addWindowListener(action);
                  //視窗縮小時的觸發事件
                  trayicon.addMouseListener(action);
                  //滑鼠點選成程式的系統托盤樣式時的觸發事件
                  systray.add(trayicon);
                  //將程式的系統托盤樣式加入到桌面系統托盤
              }catch(IOException e){
                  System.out.println(e.getLocalizedMessage());
              }catch(AWTException e){
                  System.out.println(e.getLocalizedMessage());
              }catch(UnsupportedOperationException e){
                  System.out.println(e.getLocalizedMessage());
              }
       }
}

public class action implements  WindowListener, MouseListener{
      long clicktime=0;
      public void windowIconified(WindowEvent e) {
            //按下最小化按鈕
            surface.dispose();
            //釋放包含 JFrame 的所有元件在本機螢幕上的資源
      }
    
      public void mouseClicked(MouseEvent e) {
             //滑鼠點擊
            if(isDoubleClick()==true){  //是否短時間內點擊兩下
                  surface.setExtendedState(Frame.NORMAL);
                  //設定 JFrame 狀態
                  surface.setVisible(true);
            }
      }

      public Boolean isDoubleClick(){
            //判斷是否快速滑鼠點擊兩下
            long newtime=(new Date()).getTime();
            if((newtime-clicktime)<300){    //時間間隔
                  clicktime=newtime;
                  return true;
             }else{
                  clicktime=newtime;
                  return false;
             }
       }
}

上述的程式碼還有一個小問題:當程式關閉後,程式的系統托盤樣式還會殘留在系統托盤上,必須滑鼠觸碰才會消失,目前還在解決這項問題。


參考資料:

2 則留言:

  1. 大大您好: 感謝您的這篇文章讓在下學習不少,也因而找到了您的問題解決方式,只要用 tray.remove(trayIcon); 應該就能解決您所說的托盤會殘留圖案的問題,與您分享^^

    回覆刪除
    回覆
    1. 謝謝您的分享這個方法, 我倒是沒想到可以使用這函數來解決 ^^

      刪除