首先上一个经典的Hello world示例:
1 package com.xxx.yyy.zzz; 2 3 import javax.swing.JFrame; 4 5 public class MainFrame extends JFrame { 6 7 private static final long serialVersionUID = -3059928131346032935L; 8 public MainFrame() { 9 super(); 10 this.setSize(300, 200); 11 this.getContentPane().setLayout(null); 12 this.setTitle("Hello world!"); 13 /// 设置点击窗口右上角“关闭”时的行为,点击“关闭”时停止主循环,退出程序 14 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 15 } 16 } 17 18 class Main { 19 public static void main(String[] args) { 20 MainFrame frm = new MainFrame(); 21 frm.setVisible(true); 22 } 23 }
在eclipse下编译运行上述代码,显示如下的小窗口:
很多应用软件都会在点击“最小化”这个按钮时,将窗口缩小到任务栏的数字时钟附近的一个小区域(托盘)。java自1.6版以后,在AWT里新增了两个类:SystemTray,TrayIcon。通过这两个类,java也能使用托盘图标了。
使用TrayIcon,需要准备一个小图标。jpg、png等通用的图片格式貌似都可以用,不支持M$的ico。不知道对图片的尺寸有没有要求,本人准备的是一个32*32的png,比划了一下,托盘图标的大小貌似是16*16,有可能Java会在内部做了转换呢。
以下是添加了TrayIcon之后的代码,最小化时隐藏窗口,显示托盘图标;点击图标时,图标消失,窗口复原。不过很可惜图标在托盘中只有一片空白,即使换成16*16的图片也是这样。
1 /// 实现接口WindowListener 2 public class MainFrame extends JFrame implements WindowListener{ 3 4 private static final long serialVersionUID = -3059928131346032935L; 5 /// 32*32的png图像 6 private static Image image = Toolkit.getDefaultToolkit().getImage("/c_cyan.png"); 7 /// TrayIcon对象 8 private static TrayIcon trayIcon = new TrayIcon(image,"xx助手"); 9 10 public MainFrame() { 11 super(); 12 this.setSize(300, 200); 13 this.getContentPane().setLayout(null); 14 this.setTitle("Hello world!"); 15 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 16 /// 注册本窗口Window相关事件监听器 17 this.addWindowListener(this); 18 } 19 20 public void windowActivated(WindowEvent e) {} 21 22 public void windowClosed(WindowEvent e) {} 23 24 public void windowClosing(WindowEvent e) {} 25 26 public void windowDeactivated(WindowEvent e) {} 27 28 public void windowDeiconified(WindowEvent e) { 29 } 30 31 public void windowIconified(WindowEvent e) { 32 /// 检测操作系统是否支持系统托盘 33 if (!SystemTray.isSupported()) { 34 return; 35 } 36 37 final MainFrame parent = this; 38 final SystemTray systemTray = SystemTray.getSystemTray(); 39 40 /// 设置TrayIcon自动调整图像大小,看来这么设置之后不用再关注图片尺寸了 41 trayIcon.setImageAutoSize(true); 42 /// TrayIcon添加击事件的监听器,点击后恢复主窗口,删除TrayIcon 43 trayIcon.addActionListener(new ActionListener() { 44 public void actionPerformed(ActionEvent event) { 45 /// 显示主窗口 46 parent.setVisible(true); 47 /// 从系统托盘之中移除TrayIcon,因为同一个TrayIcon不能添加两次 48 systemTray.remove(trayIcon); 49 } 50 }); 51 52 try { 53 /// 往系统托盘之中添加TrayIcon 54 systemTray.add(trayIcon); 55 } catch (AWTException exception) { 56 exception.printStackTrace(); 57 } 58 59 /// 隐藏本窗口 60 parent.setVisible(false); 61 } 62 63 public void windowOpened(WindowEvent e) {} 64 }
时间: 2024-10-28 21:10:28