版权声明:本文为博主原创文章,转载请注明出处:http://blog.csdn.net/sinat_34820292 https://blog.csdn.net/sinat_34820292/article/details/80792850
核心就是使用SystemTray类。
其中笔者遇到的坑:
1. 图标没设置自适应大小:trayIcon.setImageAutoSize(true);
导致只能显示所设图片的左上角空白
2. 为了项目导出后不依赖其他文件,图片放到src下某个包里,使用代码this.getClass().getClassLoader().getResource("prt.png")).getImage()
获取图片。
3. 下面示例没提示到的,鼠标放置在图标上显示提示文字: trayIcon.setToolTip("这是系统托盘");
4. 下面示例没有提示到的,创建系统通知:trayIcon.displayMessage("通知","连接掉线!请检查网络连接。。。", TrayIcon.MessageType.INFO);
程序最小化到系统托盘的实现示例代码:
package com.printer.view;
import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.math.*;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class KeyGen extends Frame {
/**
*
*/
private static final long serialVersionUID = 1L;
private TrayIcon trayIcon = null; // 托盘图标
private SystemTray tray = null; // 本操作系统托盘的实例
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
new KeyGen().lunchFrame();
}
public void lunchFrame() {
setLocation(500, 300);
this.setSize(400, 300);
this.setTitle("打印机驱动配置");
// 对话框logo
this.setIconImage(new ImageIcon(this.getClass().getClassLoader().getResource("logo.png")).getImage());
this.setLocationRelativeTo(null);
this.init();
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
int option = JOptionPane.showConfirmDialog(KeyGen.this,
"是否最小化到托盘?", "提示:", JOptionPane.YES_NO_OPTION);
if (option == JOptionPane.YES_OPTION) {
try {
tray.add(trayIcon);
} catch (AWTException e1) {
e1.printStackTrace();
}
setVisible(false);
} else {
System.exit(0);
}
}
public void windowIconified(WindowEvent e) {
try {
tray.add(trayIcon); // 将托盘图标添加到系统的托盘实例中
dispose();
} catch (AWTException ex) {
ex.printStackTrace();
}
}
});
this.setResizable(false);
this.setVisible(true);
if (SystemTray.isSupported()) { // 如果操作系统支持托盘
this.tray();
}
}
void tray() {
tray = SystemTray.getSystemTray(); // 获得本操作系统托盘的实例
PopupMenu pop = new PopupMenu(); // 构造一个右键弹出式菜单
MenuItem show = new MenuItem("打开程序");
MenuItem exit = new MenuItem("退出程序");
pop.add(show);
pop.add(exit);
trayIcon = new TrayIcon(new ImageIcon(this.getClass().getClassLoader().getResource("prt.png")).getImage(), "托盘", pop);
trayIcon.setImageAutoSize(true);// 图标自适应大小
//Toolkit.getDefaultToolkit().createImage("./img/logo.gif")
/**
* 添加鼠标监听器,当鼠标在托盘图标上双击时,默认显示窗口
*/
trayIcon.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) { // 鼠标双击
tray.remove(trayIcon); // 从系统的托盘实例中移除托盘图标
setExtendedState(JFrame.NORMAL);
setVisible(true); // 显示窗口
toFront();
}
}
});
show.addActionListener(new ActionListener() { // 点击“显示窗口”菜单后将窗口显示出来
public void actionPerformed(ActionEvent e) {
tray.remove(trayIcon); // 从系统的托盘实例中移除托盘图标
setExtendedState(JFrame.NORMAL);
setVisible(true); // 显示窗口
toFront();
}
});
exit.addActionListener(new ActionListener() { // 点击“退出演示”菜单后退出程序
public void actionPerformed(ActionEvent e) {
System.exit(0); // 退出程序
}
});
}
private void init() {
// 创建一张图片200
Image img = new ImageIcon(this.getClass().getClassLoader().getResource("yuan.jpg")).getImage().getScaledInstance(getWidth(), getHeight()-80, Image.SCALE_DEFAULT);
ImageIcon p_200 = new ImageIcon(img);
// 图片标签
JLabel pic = new JLabel(p_200);
pic.setBounds(0,0, getWidth(), 200);
this.add(pic);
final JTextField unamebox = new JTextField();
unamebox.setHorizontalAlignment(JTextField.CENTER);
final JButton jb1 = new JButton("设置店铺账号");
//
JPanel jp_south = new JPanel();
jp_south.setLayout(new GridLayout(2,1));
jp_south.add(unamebox);
jp_south.add(jb1);
jp_south.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
this.add(jp_south, BorderLayout.SOUTH);
jb1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String key = unamebox.getText();
unamebox.setText(ids);
System.out.println(ids);
int option = JOptionPane.showConfirmDialog(KeyGen.this,
"创建成功", "提示:", JOptionPane.YES_NO_OPTION);
if (option == JOptionPane.YES_OPTION) {
unamebox.setText(ids);
} else {
unamebox.setText(ids);
}
}
});
}
}