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);

    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM