您的位置:首页 > 其它

Swing带TrayIcon(托盘小图标)的Hello world示例

2015-08-20 17:38 246 查看
首先上一个经典的Hello world示例:

package com.xxx.yyy.zzz;

import javax.swing.JFrame;

public class MainFrame extends JFrame {

private static final long serialVersionUID = -3059928131346032935L;
public MainFrame() {
super();
this.setSize(300, 200);
this.getContentPane().setLayout(null);
this.setTitle("Hello world!");
/// 设置点击窗口右上角“关闭”时的行为,点击“关闭”时停止主循环,退出程序
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

class Main {
public static void main(String[] args) {
MainFrame frm = new MainFrame();
frm.setVisible(true);
}
}


在eclipse下编译运行上述代码,显示如下的小窗口:



很多应用软件都会在点击“最小化”这个按钮时,将窗口缩小到任务栏的数字时钟附近的一个小区域(托盘)。java自1.6版以后,在AWT里新增了两个类:SystemTray,TrayIcon。通过这两个类,java也能使用托盘图标了。

使用TrayIcon,需要准备一个小图标。jpg、png等通用的图片格式貌似都可以用,不支持M$的ico。不知道对图片的尺寸有没有要求,本人准备的是一个16*16的png,比划了一下,托盘图标的大小大概是16*16。Java的TrayIcon内部做了图像转换机制,只要设置好就行了。

以下是添加了TrayIcon之后的代码,最小化时隐藏窗口,显示托盘图标;点击图标时,图标消失,窗口出现。

/// 实现接口WindowListener
public class MainFrame extends JFrame implements WindowListener{

private static final long serialVersionUID = -3059928131346032935L;
/// 32*32的png图像
private static Image image = Toolkit.getDefaultToolkit().getImage(ClassLoader.getSystemResource("c_cyan.png"));
/// TrayIcon对象
private static TrayIcon trayIcon = new TrayIcon(image,"xx助手");

public MainFrame() {
super();
this.setSize(300, 200);
this.getContentPane().setLayout(null);
this.setTitle("Hello world!");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
/// 注册本窗口Window相关事件监听器
this.addWindowListener(this);
}

public void windowActivated(WindowEvent e) {}

public void windowClosed(WindowEvent e) {}

public void windowClosing(WindowEvent e) {}

public void windowDeactivated(WindowEvent e) {}

public void windowDeiconified(WindowEvent e) {
}

public void windowIconified(WindowEvent e) {
/// 检测操作系统是否支持系统托盘
if (!SystemTray.isSupported()) {
return;
}

final MainFrame parent = this;
final SystemTray systemTray = SystemTray.getSystemTray();

/// 设置TrayIcon自动调整图像大小,看来这么设置之后不用再关注图片尺寸了
trayIcon.setImageAutoSize(true);
/// TrayIcon添加击事件的监听器,点击后恢复主窗口,删除TrayIcon
trayIcon.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
/// 显示主窗口,设置窗口为正常状态
parent.setVisible(true);
parent.setExtendedState(JFrame.NORMAL);
/// 从系统托盘之中移除TrayIcon,因为同一个TrayIcon不能添加两次
systemTray.remove(trayIcon);
}
});

try {
/// 往系统托盘之中添加TrayIcon
systemTray.add(trayIcon);
} catch (AWTException exception) {
exception.printStackTrace();
}

/// 隐藏本窗口
parent.setVisible(false);
}

public void windowOpened(WindowEvent e) {}
}


换个32*32大小的图标,再编译运行,同样也能达到效果,只是显示出来的小图标没有16*16的清晰。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: