swing 托盘
参考文章:swing 托盘
JFrame实现系统托盘功能缩放在任务栏,窗体图标自定义
swing 最小化成托盘
代码
package org.fiend.swing.test.demo.jrame.tray.test;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/**
* JFrame最小化到托盘测试
* @author pelang 2021-09-06 22:50:56
*/
public class JFrameTrayDemo {
private static boolean isMinimize = false;
private static JFrame frame;
private static final String iconPath = "java4.jpg";;
private static Image iconImage;
private static SystemTray systemTray;
private static TrayIcon trayIcon = null;
public static void main(String[] args) {
initFrame();
JPanel jp = new JPanel();
JLabel label1 = new JLabel("证件类型:");
JComboBox cmb = new JComboBox();
cmb.addItem("--请选择--");
cmb.addItem("身份证");
cmb.addItem("驾驶证");
cmb.addItem("军官证");
jp.add(label1);
jp.add(cmb);
frame.add(jp);
frame.setVisible(true);
}
public static void initFrame() {
// 任务栏图标,最小化窗口
// image=Toolkit.getDefaultToolkit().getImage("Img/ipsicon.png");
iconImage = Toolkit.getDefaultToolkit().getImage(JFrameTrayDemo.class.getClassLoader().getResource(iconPath));
frame = new JFrame("Java下拉列表组件示例");
frame.setSize(400, 100);
frame.setLocationRelativeTo(null);
frame.setIconImage(iconImage);
// 关键,设定关闭窗口无操作,用于后面的窗体监听事件
frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
// 判断系统是否支持系统托盘, 若不支持, 直接退出
if (!SystemTray.isSupported()) {
System.exit(0);
return;
}
if (!isMinimize) {
int i = JOptionPane.showConfirmDialog(
null,
"确认要最小化窗口吗?",
"最小化窗口",
JOptionPane.OK_CANCEL_OPTION);
if (i != JOptionPane.OK_OPTION) {
System.exit(0);
return;
} else {
isMinimize = true;
}
}
try {
// 窗口最小化时dispose该窗口
frame.dispose();
frame.setExtendedState(JFrame.DISPOSE_ON_CLOSE);
} catch (Exception exception) {
exception.printStackTrace();
}
// 构建系统托盘
buildSystemTray();
}
});
}
/**
* 构建系统托盘
*/
private static void buildSystemTray() {
if (systemTray == null) {
// 创建系统托盘
systemTray = SystemTray.getSystemTray();
if (trayIcon != null) {
systemTray.remove(trayIcon);
}
}
// 初始化弹出菜单
PopupMenu popup = createPopupMenu();
trayIcon = new TrayIcon(iconImage, "fileSync", popup);
trayIcon.setImageAutoSize(true);
// 鼠标,键盘通俗事件监听
// trayIcon.addActionListener(new ActionListener() {
// @Override
// public void actionPerformed(ActionEvent e) {
// System.out.println("=====> " + e.getActionCommand());
// // TODO Auto-generated method stub
// setVisible(true);
// // systemTray.remove(trayIcon);
// }
// });
// 鼠标事件
trayIcon.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
// 双击鼠标左键托盘窗口再现
if ((e.getButton() == 1) && (e.getClickCount() == 2)) {
System.out.println("双击左键!");
frame.setVisible(true);
frame.setExtendedState(Frame.NORMAL);
systemTray.remove(trayIcon);
}
}
});
try {
// 添加托盘图标到系统托盘
systemTray.add(trayIcon);
frame.setExtendedState(Frame.ICONIFIED);
} catch (AWTException e1) {
e1.printStackTrace();
}
}
/**
* 初始化弹出式菜单
*/
private static PopupMenu createPopupMenu() {
// 创建弹出式菜单
PopupMenu popup = new PopupMenu();
// 构建系统托盘弹出菜单主界面选项和退出界面选项
MenuItem mainMenuItem = createMainMenuItem();
MenuItem autoStartMenuItem = createAutoStartMenuItem();
MenuItem exitMenuItem = createExitMenuItem();
popup.add(mainMenuItem);
popup.add(autoStartMenuItem);
// 弹出式菜单添加分割线
popup.addSeparator();
popup.add(exitMenuItem);
return popup;
}
/**
* 构建系统托盘弹出菜单 主界面选项
*/
private static MenuItem createMainMenuItem() {
MenuItem mainMenuItem = new MenuItem("Main UI");
mainMenuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// setVisible(true);
frame.setVisible(true);
frame.setExtendedState(Frame.NORMAL);
// setAlwaysOnTop(true);
systemTray.remove(trayIcon);
}
});
return mainMenuItem;
}
/**
* automatic start
* @return autoStartMenuItem
*/
private static MenuItem createAutoStartMenuItem() {
CheckboxMenuItem autoStartMenuItem = new CheckboxMenuItem("Auto start", false);
autoStartMenuItem.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
System.out.println("// ================================== //");
System.out.println("SELECTED: " + (e.getStateChange() == ItemEvent.SELECTED));
System.out.println("DESELECTED: " + (e.getStateChange() == ItemEvent.DESELECTED));
System.out.println("state: " + autoStartMenuItem.getState());
}
});
return autoStartMenuItem;
}
/**
* 构建退出程序选项
*/
private static MenuItem createExitMenuItem() {
// 构建退出程序选项
MenuItem exitMenuItem = new MenuItem("Exit");
exitMenuItem.setActionCommand("Exit");
exitMenuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("点击Exit菜单, 退出程序。");
// dispose();
System.exit(0);
}
});
return exitMenuItem;
}
}
JDialog 取消右上角关闭事件
this.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
PS:
1 图片显示空白
trayIcon.setImageAutoSize(true); //这句话必须要
2 图片存放路径问题:
在这个类的同级,创建image文件夹,图片塞进去。
然后复制到 target目录,一样复制一份到同样的类的同级
3 取消和隐藏JDialog关闭按钮
// 方法1, 禁用关闭
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
// 方法2, 隐藏
dialog.setUndecorated(true);
4 托盘图片切换
PopupMenu popupMenu = new PopupMenu();
//默认/选中 字体
Font defaultFont=new Font("宋体", Font.PLAIN,12);
Font selectFont=new Font("宋体", Font.BOLD,20);
MenuItem itemSimple = new MenuItem("Simple");
MenuItem itemMulti = new MenuItem("Multi");
MenuItem itemExit = new MenuItem("Exit");
//单个打印菜单
itemSimple.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
AppConfig.uploadFileType=1;
//改变字体
Font fontSimple=new Font("宋体", Font.BOLD,20);
itemSimple.setFont(selectFont);
itemMulti.setFont(defaultFont);
//改变托盘图标
trayIcon.setImage(new ImageIcon(getClass().getResource("image/image-regular.png")).getImage());
}
});
popupMenu.add(itemSimple);
//多个打印菜单
itemMulti.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
AppConfig.uploadFileType=2;
//改变字体
Font fontMulti=new Font("宋体", Font.BOLD,20);
itemMulti.setFont(selectFont);
itemSimple.setFont(defaultFont);
//改变托盘图标
trayIcon.setImage(new ImageIcon(getClass().getResource("image/images-regular.png")).getImage());
}
});
popupMenu.add(itemMulti);
还没有评论,来说两句吧...