2013-06-13 10 views
0

У меня есть приложение ChatServer, и когда ChatServer запустил TrayIcon, будет отображаться в системном трее. Когда я нажимаю правой кнопкой мыши на этом Trayicon, появляется меню с именем who's online, я хочу добавить MenuItem в это меню, когда клиент подключается к чату сервер, проблема заключается в том, как добавить MenuItem динамически? я использовал onlineMenu.add(next);Как добавить MenuItem в меню TrayIcon, динамически в java?

Мой класс 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); 
     } 
    }); 
} 

Теперь здесь я хочу добавить MENUITEM к onlineMenu Этот метод называют, когда клиент подключения на сервер

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

но он хочет добавить любое меню MenuMeuu, любой может помочь?

ответ

1

Если я правильно понял, вы хотите изменить всплывающее меню после того, как оно было прикреплено к Trayicon? Я считаю, что это не поддерживается.

У вас есть два варианта:.

а) построить совершенно новую PopupMenu и заменить текущее меню на TrayIcon с новым.

b.) Не прикрепляйте PopupMenu к TrayIcon вообще - вместо этого добавьте MouseListener и создайте меню, когда MouseEvent указывает isPopupTrigger() == true. Затем вы можете открыть обычное всплывающее меню Swing (это может стать сложным, если у вас нет открытого окна).

+0

Сэр, второй метод кажется слишком хорошим, но, может, вы объясните это мне? – Roshan

+0

Короткий поиск ведет здесь: http://stackoverflow.com/questions/11428042/open-popupmenu-on-task-tray-icon-with-left-click-using-java. Единственное, что вы хотите изменить, - это прослушиватель мыши для ответа на стандартную кнопку всплывающего окна. – Durandal