2014-02-11 3 views
2

Я хочу поставить эффект опрокидывания в моем JMenu это мой код:Как изменить значок для JMenuItem на опрокидывании

Icon firstPicAcc= new ImageIcon(Welcome.class.getResource("/app/resources/user1.jpg")); 
    Icon secPicAcc= new ImageIcon(Welcome.class.getResource("/app/resources/user2.jpg")); 
    JMenu mnAccountSettings = new JMenu("Account Settings"); 
    mnAccountSettings.addMouseWheelListener(new MouseWheelListener() { 
     public void mouseWheelMoved(MouseWheelEvent arg0) { 
     } 
    }); 

    mnAccountSettings.setFont(new Font("Dialog", Font.PLAIN, 20)); 
    mnAccountSettings.setForeground(new Color(0, 153, 0)); 
    mnAccountSettings.setBackground(new Color(255, 204, 255)); 
    mnAccountSettings.setRolloverEnabled(true); 
    mnAccountSettings.setIcon(firstPicAcc); 
    mnAccountSettings.setRolloverIcon(secPicAcc); 

    mnAccount.add(mnAccountSettings); 

, как я могу это сделать? благодаря! Что должно произойти, когда я накинул указатель мыши на панель JMenu, исходный значок должен измениться на другой значок.

+0

Что именно должно произойти? И можете ли вы опубликовать [Минимальный, полный, проверенный и читаемый пример] (http://stackoverflow.com/help/mcve) –

+0

Что должно произойти, когда я перевернул мышь над панелью JMenu, исходный значок должен измениться на другой значок , – harraypotter

ответ

4

То, что вы хотите сделать, это добавить ChangeListener к JMenuItem и проверить, если это selected или armed и изменить icon соответственно. ChangeListener работает как для клавиатуры, так и для мыши.

См this good read by @kleopatra

private JMenuItem createMenuItem(final ImageIcon icon, String title) { 
    JMenuItem item = new JMenuItem(title); 
    item.setIcon(icon); 

    ChangeListener cl = new ChangeListener() { 

     @Override 
     public void stateChanged(ChangeEvent e) { 
      if (e.getSource() instanceof JMenuItem) { 
       JMenuItem item = (JMenuItem) e.getSource(); 
       if (item.isSelected() || item.isArmed()) { 
        item.setIcon(stackIcon); 
       } else { 
        item.setIcon(icon); 
       } 
      } 
     } 
    }; 
    item.addChangeListener(cl); 

    return item; 
} 

enter image description here

Здесь работает пример. Просто замените изображения своими

import java.awt.event.KeyEvent; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.SwingUtilities; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class RolloverMenuItem { 
    ImageIcon stackIcon = new ImageIcon(getClass().getResource("/resources/stackoverflow2.png")); 

    public RolloverMenuItem() { 
     ImageIcon newIcon = new ImageIcon(getClass().getResource("/resources/image/new.gif")); 
     ImageIcon saveIcon = new ImageIcon(getClass().getResource("/resources/image/open.gif")); 
     ImageIcon openIcon = new ImageIcon(getClass().getResource("/resources/image/save.gif")); 

     JMenu menu = new JMenu("File"); 
     menu.setMnemonic(KeyEvent.VK_F); 
     JMenuItem item1 = createMenuItem(newIcon, "New"); 
     JMenuItem item2 = createMenuItem(openIcon, "Open"); 
     JMenuItem item3 = createMenuItem(saveIcon, "Save"); 
     menu.add(item1); 
     menu.add(item2); 
     menu.add(item3); 

     JMenuBar menuBar = new JMenuBar(); 
     menuBar.add(menu); 

     JFrame frame = new JFrame("Rollover MenuItem"); 
     frame.setJMenuBar(menuBar); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(400, 250); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    private JMenuItem createMenuItem(final ImageIcon icon, String title) { 
     JMenuItem item = new JMenuItem(title); 
     item.setIcon(icon); 

     ChangeListener cl = new ChangeListener() { 

      @Override 
      public void stateChanged(ChangeEvent e) { 
       if (e.getSource() instanceof JMenuItem) { 
        JMenuItem item = (JMenuItem) e.getSource(); 
        if (item.isSelected() || item.isArmed()) { 
         item.setIcon(stackIcon); 
        } else { 
         item.setIcon(icon); 
        } 
       } 
      } 
     }; 
     item.addChangeListener(cl); 

     return item; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new RolloverMenuItem(); 
      } 
     }); 
    } 
} 
+0

спасибо @peeskillet! Ур спасатель! – harraypotter