java - 在java中添加和删除trayicon?

标签 java trayicon

我想在窗口最小化时向系统托盘添加一个图标,并在最大化时将其删除 但我遇到了这个异常并且无法解决它。

线程“AWT-EventQueue-0”中出现异常 java.lang.IllegalArgumentException:添加已添加的 TrayIcon。

 else if (e.getSource() == MinimizeButton)
        setState(IslamicProject.ICONIFIED);
    {       // Test to see if supports Tray
        if (SystemTray.isSupported())
        {
            //Create Tray
            tray = SystemTray.getSystemTray();

            Image image = Toolkit.getDefaultToolkit().getImage("D:/Art Gallary 2008/Islamic/forsan_03.gif");
            //create menu Items
            PopupMenu popup = new PopupMenu();
            MenuItem ExitMenu = new MenuItem("Exit");
            MenuItem OpenMenu = new MenuItem("Open");
           trayIcon = new TrayIcon(image, "The Tip Text", popup);

            //add the listeners of menu items
            ListenForExitMenu EXMU = new ListenForExitMenu();
            ListenForOpenMenu OPMU = new ListenForOpenMenu();
            ExitMenu.addActionListener(EXMU);
            OpenMenu.addActionListener(OPMU);
            //adds the listener so that when icon in tray is  clicked it opens up
            //trayIcon.addActionListener(OPMU);
            mouselis l = new mouselis();
            trayIcon.addMouseListener(l);
              // the window state listener tests to see the state of the frame
            addWindowStateListener(new WindowStateListener() {
                public void windowStateChanged(WindowEvent e) {
                    if (e.getNewState() == ICONIFIED)
                    {
                        try
                        {
                            tray.add(trayIcon);
                            setVisible(false);
                        } catch (AWTException ex)
                        {
                            System.err.println("Can't add to tray");
                        }
                    }
                    if (e.getNewState() == NORMAL)
                    {
                        tray.remove(trayIcon);
                        setVisible(true);
                    }
                }

            });
            // adding the open and exit to menu
            popup.add(OpenMenu);
            popup.add(ExitMenu);
        }
        else
        {
            System.err.println("Tray unavailable");
        }
    }

最佳答案

这是一个例子:

import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame;
import javax.swing.UIManager;

/**
 *
 * @author Mohammad Faisal
 * ermohammadfaisal.blogspot.com
 * facebook.com/m.faisal6621
 *
 */

public class HideToSystemTray extends JFrame{
    TrayIcon trayIcon;
    SystemTray tray;
    HideToSystemTray(){
        super("SystemTray test");
        System.out.println("creating instance");
        try{
            System.out.println("setting look and feel");
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }catch(Exception e){
            System.out.println("Unable to set LookAndFeel");
        }
        if(SystemTray.isSupported()){
            System.out.println("system tray supported");
            tray=SystemTray.getSystemTray();

            Image image=Toolkit.getDefaultToolkit().getImage("/media/faisal/DukeImg/Duke256.png");
            ActionListener exitListener=new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.out.println("Exiting....");
                    System.exit(0);
                }
            };
            PopupMenu popup=new PopupMenu();
            MenuItem defaultItem=new MenuItem("Exit");
            defaultItem.addActionListener(exitListener);
            popup.add(defaultItem);
            defaultItem=new MenuItem("Open");
            defaultItem.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    setVisible(true);
                    setExtendedState(JFrame.NORMAL);
                }
            });
            popup.add(defaultItem);
            trayIcon=new TrayIcon(image, "SystemTray Demo", popup);
            trayIcon.setImageAutoSize(true);
        }else{
            System.out.println("system tray not supported");
        }
        addWindowStateListener(new WindowStateListener() {
            public void windowStateChanged(WindowEvent e) {
                if(e.getNewState()==ICONIFIED){
                    try {
                        tray.add(trayIcon);
                        setVisible(false);
                        System.out.println("added to SystemTray");
                    } catch (AWTException ex) {
                        System.out.println("unable to add to tray");
                    }
                }
        if(e.getNewState()==7){
                    try{
            tray.add(trayIcon);
            setVisible(false);
            System.out.println("added to SystemTray");
            }catch(AWTException ex){
            System.out.println("unable to add to system tray");
        }
            }
        if(e.getNewState()==MAXIMIZED_BOTH){
                    tray.remove(trayIcon);
                    setVisible(true);
                    System.out.println("Tray icon removed");
                }
                if(e.getNewState()==NORMAL){
                    tray.remove(trayIcon);
                    setVisible(true);
                    System.out.println("Tray icon removed");
                }
            }
        });
        setIconImage(Toolkit.getDefaultToolkit().getImage("Duke256.png"));

        setVisible(true);
        setSize(300, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    public static void main(String[] args){
        new HideToSystemTray();
    }
}

关于java - 在java中添加和删除trayicon?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18440736/

相关文章:

java - ear 部署失败 - 无法解析引用 Remote ejb-ref

windows - 你能有一个只包含托盘(通知)图标的 win32 程序吗?

java - JUnit测试递归方法

java - 关于使用android获取IMEI,有以下错误

java - 代码将打印字符但不会使游戏移动

java - JTextField 有 getEditor() 方法吗?

C#清除已关闭应用程序的托盘图标

python - 关闭 QMessagebox 窗口后 PyQt 应用程序崩溃

c# - 在c#中防止多个托盘图标

当 java 应用程序安装为 Windows 7 服务时,java.awt.Trayicon 不显示