JAVA SE踩坑实践——程序最小化到系统托盘 SystemTray

版权声明:本文为博主原创文章,转载请注明出处: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);
                }

            }
        });
    }
}

猜你喜欢

转载自blog.csdn.net/sinat_34820292/article/details/80792850
今日推荐