Question

I have a ChatServer application , and when ChatServer started a TrayIcon will display in the system tray , When i right click on that Trayicon there is a Menu called who's online , i want to add MenuItem to this menu when a client is connect chat server , the problem is how to add MenuItem dynamically? i have used onlineMenu.add(next);

My TrayIcon class is as below ,(not the whole code)

public class TrayIconDemo {
     private TrayIcon trayIcon ;
     private Menu onlineMenu = new Menu("Who's Online(?)");

     public void startUp() {
    /* Use an appropriate Look and Feel */
    try {
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        //UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
    } catch (UnsupportedLookAndFeelException ex) {
        ex.printStackTrace();
    } catch (IllegalAccessException ex) {
        ex.printStackTrace();
    } catch (InstantiationException ex) {
        ex.printStackTrace();
    } catch (ClassNotFoundException ex) {
        ex.printStackTrace();
    }
    /* Turn off metal's use of bold fonts */
    UIManager.put("swing.boldMetal", Boolean.FALSE);
    //Schedule a job for the event-dispatching thread:
    //adding TrayIcon.
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI();
        }
    });
}


private void createAndShowGUI() {
    //Check the SystemTray support
    if (!SystemTray.isSupported()) {
        System.out.println("SystemTray is not supported");
        return;
    }
    final PopupMenu popup = new PopupMenu();
    trayIcon = new TrayIcon(createImage("images/bulb.gif", "tray icon"));
    final SystemTray tray = SystemTray.getSystemTray();

    // Create a popup menu components
    MenuItem aboutItem = new MenuItem("About");
    //CheckboxMenuItem cb1 = new CheckboxMenuItem("Set auto size");
    //CheckboxMenuItem cb2 = new CheckboxMenuItem("Set tooltip");

   // MenuItem errorItem = new MenuItem("Error");
   // MenuItem warningItem = new MenuItem("Warning");
    MenuItem infoItem = new MenuItem("Info");
   // MenuItem noneItem = new MenuItem("None");
    MenuItem exitItem = new MenuItem("Exit");

    //Add components to popup menu
    popup.add(aboutItem);
    popup.addSeparator();
   // popup.add(cb1);
   // popup.add(cb2);
    popup.addSeparator();
    popup.add(onlineMenu);
    //onlineMenu.add("Hi...");
    //displayMenu.add(errorItem);
    //displayMenu.add(warningItem);
    //displayMenu.add(infoItem);
    //displayMenu.add(noneItem);
    popup.add(exitItem);

    trayIcon.setPopupMenu(popup);
    trayIcon.setImageAutoSize(true);
    trayIcon.setToolTip("Chat Server "+serverIpAddress+"");


    try {
        tray.add(trayIcon);
    } catch (AWTException e) {
        System.out.println("TrayIcon could not be added.");
        return;
    }
    //Default Tray notification
    trayIcon.displayMessage("Server", "Server Started! server IP is "+serverIpAddress+"",
        TrayIcon.MessageType.NONE);
    trayIcon.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            JOptionPane.showMessageDialog(null,
                    "Chat Server Started and Running succesfully.");
        }
    });

    aboutItem.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            JOptionPane.showMessageDialog(null,
                    "Chat server version 1.01.Developed by Roshan.");
        }
    });

   /* cb1.addItemListener(new ItemListener() {
        public void itemStateChanged(ItemEvent e) {
            int cb1Id = e.getStateChange();
            if (cb1Id == ItemEvent.SELECTED){
                trayIcon.setImageAutoSize(true);
            } else {
                trayIcon.setImageAutoSize(false);
            }
        }
    });*/

    /*cb2.addItemListener(new ItemListener() {
        public void itemStateChanged(ItemEvent e) {
            int cb2Id = e.getStateChange();
            if (cb2Id == ItemEvent.SELECTED){
                trayIcon.setToolTip("Chat Server");
            } else {
                trayIcon.setToolTip(null);
            }
        }
    });*/

    ActionListener listener = new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            MenuItem item = (MenuItem)e.getSource();
            //TrayIcon.MessageType type = null;
            System.out.println(item.getLabel());
            if ("Error".equals(item.getLabel())) {
                //type = TrayIcon.MessageType.ERROR;
                trayIcon.displayMessage("Chat Server",
                        "This is an error message", TrayIcon.MessageType.ERROR);

            } else if ("Warning".equals(item.getLabel())) {
                //type = TrayIcon.MessageType.WARNING;
                trayIcon.displayMessage("Sun TrayIcon Demo",
                        "This is a warning message", TrayIcon.MessageType.WARNING);

            } else if ("Info".equals(item.getLabel())) {
                //type = TrayIcon.MessageType.INFO;
                trayIcon.displayMessage("Sun TrayIcon Demo",
                        "This is an info message", TrayIcon.MessageType.INFO);

            } else if ("None".equals(item.getLabel())) {
                //type = TrayIcon.MessageType.NONE;
                trayIcon.displayMessage("Sun TrayIcon Demo",
                        "This is an ordinary message", TrayIcon.MessageType.NONE);
            }
        }
    };

    //errorItem.addActionListener(listener);
    //warningItem.addActionListener(listener);
    infoItem.addActionListener(listener);
    //noneItem.addActionListener(listener);


    exitItem.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            tray.remove(trayIcon);
            System.exit(0);
        }
    });
}

Now here i want to add a menuItem to the onlineMenu This method will call when the client is connect to the server

public void setClientIpName(String ipNameClient){//receiving ipNameClient veriable inside ip+com_name
  String[] token =ipNameClient.split("/"); //token[1]=ip , token[2]=computer name
  this.addClient(token[2]);//send name nad return treeset 
  if(!clients.isEmpty()){
    JOptionPane.showMessageDialog(null,clients.size()+"");
    Iterator iterator;
    iterator = clients.iterator(); 
    while (iterator.hasNext()){
    String next = iterator.next()+"";
         onlineMenu.add(next);
      }
}
}

but it want add any MenuItem to the onlineMenu , anyone can help?

Was it helpful?

Solution

If I understand correctly, you want to modify the popup menu after it has been attached to the Trayicon? I believe that is not supported.

You have two alternatives:

a.) Construct an entirely new PopupMenu and replace the current menu of the TrayIcon with the new one.

b.) Don't attach any PopupMenu to the TrayIcon at all - instead attach a MouseListener and create the menu when a MouseEvent indicates isPopupTrigger() == true. You can then open a normal Swing popup menu (this can get tricky if you have not open window).

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top