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