• Java Swing 托盘闪烁Demo实例


    桌面程序当中,托盘显示是一个常用的功能。

    C#的WinForm程序要实现托盘是挺轻松的,而Java Swing要实现这个功能虽然也不难,

    但是由于Java Swing开发者或许没有C#多,所以看到很多新手求助这个实例。

    我写了一个很简单的Demo,希望能帮到所需要的人。

    因为很简单,不赘述讲解,直接上代码。

    (工程目录截图,以及Demo用到的png托盘图标都放在文末了)

    (另有不清楚的可以联系QQ:119945778)

    package ui;
    
    import java.awt.AWTException;
    import java.awt.EventQueue;
    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 javax.swing.ImageIcon;
    import javax.swing.JFrame;
    
    public class TuoPanDemo extends JFrame
    {
        private static final long serialVersionUID = 1L;
    
        // 当前操作系统的托盘对象
        private SystemTray sysTray;
    
        // 托盘图标
        private TrayIcon trayIcon;
    
        // 图片
        private ImageIcon icon = null;
    
        // 消息是否需要闪烁。默认false不需要闪烁。这个状态需要跨线程修改的。
        // 所以为了健壮代码、线程安全,注意使用关键字volatile
        private volatile boolean msgNeedFlash = false;
    
        public static void main(String[] args)
        {
            EventQueue.invokeLater(new Runnable()
            {
                public void run()
                {
                    try
                    {
                        TuoPanDemo frame = new TuoPanDemo();
                        frame.setVisible(true);
                    }
                    catch (Exception e)
                    {
                        e.printStackTrace();
                    }
                }
            });
        }
    
        public TuoPanDemo()
        {
            setBounds(100, 100, 450, 300);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 这句可以注释掉的,用托盘右键退出程序即可。
            getContentPane().setLayout(null);
            setLocationRelativeTo(null);
    
            createTrayIcon();
    
            // 这里可以开启检测是否有消息的线程,如果有,就闪烁图标
            new Thread(runnableFlash).start();
        }
    
        private void createTrayIcon()
        {
            // 实例化当前操作系统的托盘对象
            sysTray = SystemTray.getSystemTray();
    
            // 实例化一个图标
            icon = new ImageIcon(TuoPanDemo.class.getResource("/img/rabbit_24px.png"));
    
            // Java托盘程序必须有一个右键菜单
            PopupMenu popupMenu = new PopupMenu();
            MenuItem menuOpen = new MenuItem("Open Msg");
            MenuItem menuExit = new MenuItem("Exit");
            popupMenu.add(menuOpen);
            popupMenu.add(menuExit);
    
            // 为右键弹出菜单项添加事件
            menuOpen.addActionListener(new ActionListener()
            {
                @Override
                public void actionPerformed(ActionEvent e)
                {
                    EventQueue.invokeLater(new Runnable()
                    {
                        @Override
                        public void run()
                        {
                            Msg msg = new Msg();
                            msg.setVisible(true); // 显示窗口
                            msg.toFront(); // 显示窗口到最前端
                        }
                    });
    
                    msgNeedFlash = false; // 消息打开了,就不要闪烁了
                }
            });
            menuExit.addActionListener(new ActionListener()
            {
                @Override
                public void actionPerformed(ActionEvent e)
                {
                    System.exit(0);
                }
            });
    
            // 实例化托盘图标
            trayIcon = new TrayIcon(icon.getImage(), "消息盒子", popupMenu);
    
            // 图标大小自适应
            trayIcon.setImageAutoSize(true);
    
            // 将托盘图标添入托盘
            try
            {
                sysTray.add(trayIcon);
            }
            catch (AWTException e1)
            {
                e1.printStackTrace();
            }
    
        }
    
        private Runnable runnableFlash = new Runnable()
        {
            @Override
            public void run()
            {
                while (true)
                {
                    if (msgNeedFlash == true)// 如果新消息需要闪烁
                    {
                        try
                        {
                            // 闪动消息的空白时间
                            trayIcon.setImage(new ImageIcon("").getImage());
                            Thread.sleep(500);
                            // 闪动消息的提示图片
                            trayIcon.setImage(icon.getImage());
                            Thread.sleep(500);
                        }
                        catch (Exception e)
                        {
                            e.printStackTrace();
                        }
                    }
                    else //如果不需要闪烁,就重置托盘图标
                    {
                        trayIcon.setImage(icon.getImage());
                        try
                        {
                            Thread.sleep(1000 * 10);//10秒闪烁一次。可以在这里读数据库是否有新的审批
                            msgNeedFlash = true;
                        }
                        catch (InterruptedException e)
                        {
                            e.printStackTrace();
                        }
                    }
                }
            }
        };
    }
    package ui;
    
    import java.awt.EventQueue;
    
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    
    public class Msg extends JFrame
    {
        private static final long serialVersionUID = 1L;
    
        public static void main(String[] args)
        {
            EventQueue.invokeLater(new Runnable()
            {
                public void run()
                {
                    try
                    {
                        Msg frame = new Msg();
                        frame.setVisible(true);
                    }
                    catch (Exception e)
                    {
                        e.printStackTrace();
                    }
                }
            });
        }
    
        public Msg()
        {
            setBounds(100, 100, 260, 120);
            setResizable(false);
            setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            getContentPane().setLayout(null);
            
            JLabel label = new JLabel("您有新的消息");
            label.setBounds(77, 30, 100, 15);
            getContentPane().add(label);
    
        }
    }

     

  • 相关阅读:
    浅谈servlet源码
    移动端测试的8大过程
    Pc端微信加群和app端加群测试用例设计点
    视频播放的用例设计点
    发红包的测试用例设计点
    朋友圈点赞用例设计点
    ADB
    语音 小说 逻辑
    nginx
    Jenkins—安装与简单使用
  • 原文地址:https://www.cnblogs.com/sungong1987/p/7844456.html
Copyright © 2020-2023  润新知