JAVA托盤程式SystemTray的心得

瘋子先生發表於2015-11-04
</pre><p>因為工作需要,又拾起了很久不用swing,還好沒忘乾淨,需要做一個一直在後臺執行的托盤程式,經過一番努力終於成功了。</p><p>首先你要搞一個JFrame出來,如果你需要視窗,那就加上視窗,如果你只是需要後臺執行,不設定視窗也可以,當然也可以選擇設定了視窗大小,直接隱藏。將Resizable屬性設定為false就可以了。廢話不多說下面是JFrame程式碼<pre name="code" class="java">import javax.swing.JFrame;


public class MainFrame extends JFrame{

	
	//呼叫SetTray()類,設定程式系統托盤功能
	//如果需要顯示視窗那就呼叫SetTray的帶引數的方法SetTray() 
	public MainFrame(){
		new SetTray();   
	}
	
	public void init(){
//	        this.setTitle("資料庫讀取");  	       		
//		//設定視窗大小
//		this.setSize(300, 200);
//		//設定視窗右上角顯示的元件(最大化,最小化,關閉)
//		this.setDefaultCloseOperation(3);
//		//視窗在螢幕中間顯示
//		this.setLocationRelativeTo(null);
		//視窗螢幕居中
//			center();   
//		//設定視窗大小不可改變
//		this.setResizable(false);
//		//設定視窗是否可見
//		this.setVisible(true);
		//設定jf的佈局方式
//	        this.setLayout(null);
		//設定視窗關閉處理,與關閉窗體事件搭配 
//		this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);   
	}
	//視窗居中
//    private void center()      
//    {  
	
	//獲得當前螢幕的尺寸
//      Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize(); 
	//獲得JFrame尺寸     
//      Dimension jframeSize=this.getSize();  
//      setLocation((screenSize.width-jframeSize.width)/2,(screenSize.height-jframeSize.height)/2);  
//    }  
  
    public static void main(String[] args)   
    {  
        new MainFrame();  
    }  
	
	
}
下面是實現托盤程式的程式碼。

首先我們需要解決的是托盤圖示右鍵選單中文亂碼問題。上網百度了一下,發現情況各異,本人用的是myeclipse10.7的環境,所以設定上有所不同。

右鍵一個java的class檔案(.java),Run As--》Run Configuration

在該選項卡中新增這麼一句話-Dfile.encoding=GB18030

第二要解決的問題,就是載入的托盤圖示在系統托盤圖示顯示出不顯示的問題。

在網上找了n中辦法都不行,最終總結了下面的方法。

被框住的兩句是重點,被註釋掉的程式碼都不能達到顯示托盤圖示的目的。一開始只是加入了setImageAutoSize()屬性,沒效果,無論是跟ImageIcon()還是Toolkit.getDefaultToolkit()方法還有其他方法組合均無效果。

本以為是圖片的格式或者大小引起的不能正常顯示,所以換了圖片大小從256x256換到16x16,格式試過png,jpg,ico等等,無效果。

唯一可行的便是載入ImageIo包,呼叫其read方法獲取Resource。

下面是我的project的結構圖


兩部分都是完整程式碼,可以直接執行。



import java.awt.*;
import java.awt.event.*;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.*;

public class  SetTray implements ActionListener
{
	PopupMenu popup;
	MenuItem open,close;
	//工作列程式托盤圖示
	TrayIcon trayicon;	
	JFrame jframe;
	
	
	public SetTray()
	{
		//this.jframe=jframe;
		//初始化托盤元件
		init();	
	}
	public SetTray(JFrame jframe){
		this.jframe=jframe;
		//初始化托盤元件
		init();	
	}

	//初始化程式托盤元件
	private void init()
	{
		popup=new PopupMenu();
		/*open=new MenuItem("開啟");
		open.addActionListener(this);*/

		close=new MenuItem("退出");
		close.addActionListener(this);

		//popup.add(open);
		popup.add(close);

		//檢查平臺是否受支援系統托盤
		if(SystemTray.isSupported())
		{
			SystemTray tray=SystemTray.getSystemTray();
			//ImageIcon imageIcon=new ImageIcon("cn\\yl\\frame\\8.png");  //獲得托盤顯示圖示
			//Image icon=imageIcon.getImage();	//獲得Image物件
			//Image icon=this.getToolkit().getImage(this.getClass().getClassLoader().getResource("images/user_edit.png"));
			//Image icon = Toolkit.getDefaultToolkit().getImage("d11.ico");  
			//System.out.println(icon.toString());
			//trayicon=new TrayIcon(icon,"java系統托盤",pop);
			try {
				trayicon = new TrayIcon(ImageIO.read(getClass().getClassLoader().getResource("d11.png")),"Tray demo",popup);
			} catch (IOException e1) {
				System.out.println("圖片載入失敗!");
			}
			//關鍵點,設定托盤圖示的自適應屬性,這樣才能在系統顯示托盤處正常顯示出需要的圖片。
			trayicon.setImageAutoSize(true);
			trayicon.addMouseListener(new MouseAdapter(){
			//為托盤新增滑鼠事件,雙擊則開啟程式介面
			/*public void mouseClicked(MouseEvent e)
			{
				if(e.getClickCount()==2)
				{
					openFrame();
				}
			}*/
			});

			try{
				tray.add(trayicon);
			}catch(AWTException e)
			{
				e.printStackTrace();
			}

		}

/*		//新增窗體事件
		jframe.addWindowListener(new WindowListener(){
		public void windowActivated(WindowEvent arg0) {
		}

		//隱藏程式於系統托盤函式,點選視窗的關閉按鈕時彈出提示,更具提示選擇是否隱藏到系統托盤
		public void windowClosed(WindowEvent arg0) {
		jframe.setVisible(false);
		jframe.dispose();
		}

		public void windowClosing(WindowEvent arg0) {
		int a=JOptionPane.showConfirmDialog(jframe,"[是] 退出,[否] 隱藏?","提示",0);  
			if(a==0){System.exit(0);}
			else if(a==1){jframe.setVisible(false);}
		}

		public void windowDeactivated(WindowEvent arg0) {
		
		}

		public void windowDeiconified(WindowEvent arg0) {
		}
		//視窗最小化
		public void windowIconified(WindowEvent arg0) {
			jframe.setVisible(false);
		}

		public void windowOpened(WindowEvent arg0) {
		
		}
		});*/
	}

	//托盤選單
	public void actionPerformed(ActionEvent e)
	{	//右鍵托盤選單選擇開啟,呼叫openJFrame函式
		/*if(e.getSource()==open)
		{
			openJFrame();
		}*/
		//退出托盤程式
		if(e.getSource()==close)
		{
			System.exit(-1);
		}
	}

//	//顯示程式介面
//	public void openJFrame()
//	{
//		jframe.setVisible(true);
//		jframe.setAlwaysOnTop(true);
//	}


}


相關文章