JAVA托盘程序SystemTray的心得

因为工作需要,又拾起了很久不用swing,还好没忘干净,需要做一个一直在后台运行的托盘程序,经过一番努力终于成功了。

首先你要搞一个JFrame出来,如果你需要窗口,那就加上窗口,如果你只是需要后台运行,不设置窗口也可以,当然也可以选择设置了窗口大小,直接隐藏。将Resizable属性设置为false就可以了。废话不多说下面是JFrame代码

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 ConfigurationJAVA托盘程序SystemTray的心得_第1张图片

在该选项卡中添加这么一句话-Dfile.encoding=GB18030

JAVA托盘程序SystemTray的心得_第2张图片

第二要解决的问题,就是加载的托盘图标在系统托盘图标显示出不显示的问题。

在网上找了n中办法都不行,最终总结了下面的方法。

JAVA托盘程序SystemTray的心得_第3张图片

被框住的两句是重点,被注释掉的代码都不能达到显示托盘图标的目的。一开始只是加入了setImageAutoSize()属性,没效果,无论是跟ImageIcon()还是Toolkit.getDefaultToolkit()方法还有其他方法组合均无效果。

本以为是图片的格式或者大小引起的不能正常显示,所以换了图片大小从256x256换到16x16,格式试过png,jpg,ico等等,无效果。

唯一可行的便是加载ImageIo包,调用其read方法获取Resource。

下面是我的project的结构图

JAVA托盘程序SystemTray的心得_第4张图片

两部分都是完整代码,可以直接执行。



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);
//	}


}


你可能感兴趣的:(工作,java)