2013-10-08 4 views
0

Этого кода добавляет Избраные песни пользователя в JMenuItem из ArrayMapJMenuItem обновления без перезапуска клиента

 public void actionPerformed(ActionEvent evt) { 
    String cmd = evt.getActionCommand(); 
    if (cmd != null) { 
     if (cmd.equalsIgnoreCase("Favorite song")) { 
      Music.f.add(Music.s); 
      System.out.println(Music.s + " added to favorites"); 
      System.out.println(Music.f + " current list"); 

     } 
    } 
} 
    public void initUI() { 
    try { 
    //... 

     JMenu fileMenu = new JMenu("Music And Sound Options"); 
     JMenu favorites = new JMenu("Favorite songs"); 

     for (String name : Music.f) { 
      JMenuItem menuItem = new JMenuItem(name); 
      menuItem.addActionListener(this); 
      favorites.add(menuItem); 
     } 


     JMenuBar menuBar = new JMenuBar(); 
     JMenuBar jmenubar = new JMenuBar(); 

     frame.add(jmenubar); 
     menuBar.add(favorites); 
     frame.getContentPane().add(menuBar, BorderLayout.NORTH); 
     frame.pack(); 
     frame.setVisible(true); // can see the client 

     init(); 
     //... 
    } catch (Exception e) { e.printStackTrace(); } 
} 

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

ответ

2
//JMenu favorites = new JMenu("Favorite songs");  
favorites = new JMenu("Favorite songs"); 

Меню «Избранное» должно быть определено как переменная класса. Затем, когда вы это сделаете, ваш ActionListener теперь может ссылаться на меню и добавлять в меню новый пункт меню.

if (cmd.equalsIgnoreCase("Favorite song")) { 
    Music.f.add(Music.s); 
    System.out.println(Music.s + " added to favorites"); 
    System.out.println(Music.f + " current list"); 
    JMenuItem item = new JMenItem(...); 
    favorites.add(item); 
0

Если вы сохраните ссылку на ваш JMenuBar как поле класса, вы можете вызвать menuBar.removeAll() и заселить его новые пункты меню каждый раз, когда вы хотите (хотя убедитесь, что вы делаете это на свинг нити, когда вы делаете, используя SwingUtilities.invokeLater() или ваш метод Swing по выбору).

+0

Нет необходимости использовать invokeLater, потому что код из прослушивателя выполняется на EDT. – camickr

+0

Право; Я пропустил этот OP, чтобы это произошло внутри метода слушателя. Это то, что я получаю за то, что делаю слишком много вещей сразу ... – Josh