0

我有一个 ChatServer 应用程序,当 ChatServer 启动时,系统托盘中将显示一个 TrayIcon,当我右键单击该 Trayicon 时,有一个名为 who's online 的菜单,我想在客户端连接聊天服务器时将 MenuItem 添加到此菜单,问题是如何动态添加 MenuItem?我用过 onlineMenu.add(next);

我的 TrayIcon 类如下,(不是整个代码)

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

现在在这里我想向 onlineMenu 添加一个 menuItem 当客户端连接到服务器时将调用此方法

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

但它想将任何 MenuItem 添加到 onlineMenu ,有人可以帮忙吗?

4

1 回答 1

1

如果我理解正确,您想在弹出菜单附加到 Trayicon 后对其进行修改?我相信是不支持的。

您有两种选择:

a.) 构建一个全新的 PopupMenu 并将 TrayIcon 的当前菜单替换为新菜单。

b.) 根本不要将任何 PopupMenu 附加到 TrayIcon - 而是附加一个 MouseListener 并在 MouseEvent 指示 isPopupTrigger() == true 时创建菜单。然后您可以打开一个普通的 Swing 弹出菜单(如果您没有打开窗口,这可能会变得很棘手)。

于 2013-06-13T15:50:19.447 回答