swing 托盘

Dear 丶 2022-09-10 08:29 273阅读 0赞

参考文章:swing 托盘

JFrame实现系统托盘功能缩放在任务栏,窗体图标自定义

swing 最小化成托盘

代码

  1. package org.fiend.swing.test.demo.jrame.tray.test;
  2. import javax.swing.*;
  3. import java.awt.*;
  4. import java.awt.event.*;
  5. /**
  6. * JFrame最小化到托盘测试
  7. * @author pelang 2021-09-06 22:50:56
  8. */
  9. public class JFrameTrayDemo {
  10. private static boolean isMinimize = false;
  11. private static JFrame frame;
  12. private static final String iconPath = "java4.jpg";;
  13. private static Image iconImage;
  14. private static SystemTray systemTray;
  15. private static TrayIcon trayIcon = null;
  16. public static void main(String[] args) {
  17. initFrame();
  18. JPanel jp = new JPanel();
  19. JLabel label1 = new JLabel("证件类型:");
  20. JComboBox cmb = new JComboBox();
  21. cmb.addItem("--请选择--");
  22. cmb.addItem("身份证");
  23. cmb.addItem("驾驶证");
  24. cmb.addItem("军官证");
  25. jp.add(label1);
  26. jp.add(cmb);
  27. frame.add(jp);
  28. frame.setVisible(true);
  29. }
  30. public static void initFrame() {
  31. // 任务栏图标,最小化窗口
  32. // image=Toolkit.getDefaultToolkit().getImage("Img/ipsicon.png");
  33. iconImage = Toolkit.getDefaultToolkit().getImage(JFrameTrayDemo.class.getClassLoader().getResource(iconPath));
  34. frame = new JFrame("Java下拉列表组件示例");
  35. frame.setSize(400, 100);
  36. frame.setLocationRelativeTo(null);
  37. frame.setIconImage(iconImage);
  38. // 关键,设定关闭窗口无操作,用于后面的窗体监听事件
  39. frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
  40. frame.addWindowListener(new WindowAdapter() {
  41. public void windowClosing(WindowEvent e) {
  42. // 判断系统是否支持系统托盘, 若不支持, 直接退出
  43. if (!SystemTray.isSupported()) {
  44. System.exit(0);
  45. return;
  46. }
  47. if (!isMinimize) {
  48. int i = JOptionPane.showConfirmDialog(
  49. null,
  50. "确认要最小化窗口吗?",
  51. "最小化窗口",
  52. JOptionPane.OK_CANCEL_OPTION);
  53. if (i != JOptionPane.OK_OPTION) {
  54. System.exit(0);
  55. return;
  56. } else {
  57. isMinimize = true;
  58. }
  59. }
  60. try {
  61. // 窗口最小化时dispose该窗口
  62. frame.dispose();
  63. frame.setExtendedState(JFrame.DISPOSE_ON_CLOSE);
  64. } catch (Exception exception) {
  65. exception.printStackTrace();
  66. }
  67. // 构建系统托盘
  68. buildSystemTray();
  69. }
  70. });
  71. }
  72. /**
  73. * 构建系统托盘
  74. */
  75. private static void buildSystemTray() {
  76. if (systemTray == null) {
  77. // 创建系统托盘
  78. systemTray = SystemTray.getSystemTray();
  79. if (trayIcon != null) {
  80. systemTray.remove(trayIcon);
  81. }
  82. }
  83. // 初始化弹出菜单
  84. PopupMenu popup = createPopupMenu();
  85. trayIcon = new TrayIcon(iconImage, "fileSync", popup);
  86. trayIcon.setImageAutoSize(true);
  87. // 鼠标,键盘通俗事件监听
  88. // trayIcon.addActionListener(new ActionListener() {
  89. // @Override
  90. // public void actionPerformed(ActionEvent e) {
  91. // System.out.println("=====> " + e.getActionCommand());
  92. // // TODO Auto-generated method stub
  93. // setVisible(true);
  94. // // systemTray.remove(trayIcon);
  95. // }
  96. // });
  97. // 鼠标事件
  98. trayIcon.addMouseListener(new MouseAdapter() {
  99. @Override
  100. public void mouseClicked(MouseEvent e) {
  101. // 双击鼠标左键托盘窗口再现
  102. if ((e.getButton() == 1) && (e.getClickCount() == 2)) {
  103. System.out.println("双击左键!");
  104. frame.setVisible(true);
  105. frame.setExtendedState(Frame.NORMAL);
  106. systemTray.remove(trayIcon);
  107. }
  108. }
  109. });
  110. try {
  111. // 添加托盘图标到系统托盘
  112. systemTray.add(trayIcon);
  113. frame.setExtendedState(Frame.ICONIFIED);
  114. } catch (AWTException e1) {
  115. e1.printStackTrace();
  116. }
  117. }
  118. /**
  119. * 初始化弹出式菜单
  120. */
  121. private static PopupMenu createPopupMenu() {
  122. // 创建弹出式菜单
  123. PopupMenu popup = new PopupMenu();
  124. // 构建系统托盘弹出菜单主界面选项和退出界面选项
  125. MenuItem mainMenuItem = createMainMenuItem();
  126. MenuItem autoStartMenuItem = createAutoStartMenuItem();
  127. MenuItem exitMenuItem = createExitMenuItem();
  128. popup.add(mainMenuItem);
  129. popup.add(autoStartMenuItem);
  130. // 弹出式菜单添加分割线
  131. popup.addSeparator();
  132. popup.add(exitMenuItem);
  133. return popup;
  134. }
  135. /**
  136. * 构建系统托盘弹出菜单 主界面选项
  137. */
  138. private static MenuItem createMainMenuItem() {
  139. MenuItem mainMenuItem = new MenuItem("Main UI");
  140. mainMenuItem.addActionListener(new ActionListener() {
  141. @Override
  142. public void actionPerformed(ActionEvent e) {
  143. // setVisible(true);
  144. frame.setVisible(true);
  145. frame.setExtendedState(Frame.NORMAL);
  146. // setAlwaysOnTop(true);
  147. systemTray.remove(trayIcon);
  148. }
  149. });
  150. return mainMenuItem;
  151. }
  152. /**
  153. * automatic start
  154. * @return autoStartMenuItem
  155. */
  156. private static MenuItem createAutoStartMenuItem() {
  157. CheckboxMenuItem autoStartMenuItem = new CheckboxMenuItem("Auto start", false);
  158. autoStartMenuItem.addItemListener(new ItemListener() {
  159. @Override
  160. public void itemStateChanged(ItemEvent e) {
  161. System.out.println("// ================================== //");
  162. System.out.println("SELECTED: " + (e.getStateChange() == ItemEvent.SELECTED));
  163. System.out.println("DESELECTED: " + (e.getStateChange() == ItemEvent.DESELECTED));
  164. System.out.println("state: " + autoStartMenuItem.getState());
  165. }
  166. });
  167. return autoStartMenuItem;
  168. }
  169. /**
  170. * 构建退出程序选项
  171. */
  172. private static MenuItem createExitMenuItem() {
  173. // 构建退出程序选项
  174. MenuItem exitMenuItem = new MenuItem("Exit");
  175. exitMenuItem.setActionCommand("Exit");
  176. exitMenuItem.addActionListener(new ActionListener() {
  177. @Override
  178. public void actionPerformed(ActionEvent e) {
  179. System.out.println("点击Exit菜单, 退出程序。");
  180. // dispose();
  181. System.exit(0);
  182. }
  183. });
  184. return exitMenuItem;
  185. }
  186. }

JDialog 取消右上角关闭事件

  1. this.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);

PS:

1 图片显示空白

  1. trayIcon.setImageAutoSize(true); //这句话必须要

2 图片存放路径问题:

在这个类的同级,创建image文件夹,图片塞进去。

然后复制到 target目录,一样复制一份到同样的类的同级

3 取消和隐藏JDialog关闭按钮

  1. // 方法1, 禁用关闭
  2. frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
  3. // 方法2, 隐藏
  4. dialog.setUndecorated(true);

4 托盘图片切换

  1. PopupMenu popupMenu = new PopupMenu();
  2. //默认/选中 字体
  3. Font defaultFont=new Font("宋体", Font.PLAIN,12);
  4. Font selectFont=new Font("宋体", Font.BOLD,20);
  5. MenuItem itemSimple = new MenuItem("Simple");
  6. MenuItem itemMulti = new MenuItem("Multi");
  7. MenuItem itemExit = new MenuItem("Exit");
  8. //单个打印菜单
  9. itemSimple.addActionListener(new ActionListener() {
  10. @Override
  11. public void actionPerformed(ActionEvent e) {
  12. AppConfig.uploadFileType=1;
  13. //改变字体
  14. Font fontSimple=new Font("宋体", Font.BOLD,20);
  15. itemSimple.setFont(selectFont);
  16. itemMulti.setFont(defaultFont);
  17. //改变托盘图标
  18. trayIcon.setImage(new ImageIcon(getClass().getResource("image/image-regular.png")).getImage());
  19. }
  20. });
  21. popupMenu.add(itemSimple);
  22. //多个打印菜单
  23. itemMulti.addActionListener(new ActionListener() {
  24. @Override
  25. public void actionPerformed(ActionEvent e) {
  26. AppConfig.uploadFileType=2;
  27. //改变字体
  28. Font fontMulti=new Font("宋体", Font.BOLD,20);
  29. itemMulti.setFont(selectFont);
  30. itemSimple.setFont(defaultFont);
  31. //改变托盘图标
  32. trayIcon.setImage(new ImageIcon(getClass().getResource("image/images-regular.png")).getImage());
  33. }
  34. });
  35. popupMenu.add(itemMulti);

发表评论

表情:
评论列表 (有 0 条评论,273人围观)

还没有评论,来说两句吧...

相关阅读

    相关 swing 托盘

    参考文章:[swing 托盘][swing] [JFrame实现系统托盘功能缩放在任务栏,窗体图标自定义][JFrame] [swing 最小化成托盘][swing 1]

    相关 C++刷新托盘程序

    项目中需要重启一个托盘程序。但是重启之后,任务栏的托盘程序图标增加了一个,原来的图标并没有消失。 原来任务栏的托盘程序图标,当鼠标在上面移动过之后才会刷新。所以一个解决办法