2015-09-09 4 views
3

Я хочу, чтобы меню в строке меню меняло свой цвет фона на мыши над .. как в большинстве приложений.
я хочу этот эффект ->Sample Picture
, что я пытался до сих пор ...Как изменить цвет названия меню на мыши (в java Swing)?

public class Menu extends JMenuBar implements ActionListener { 

private JMenuItem fileItem_close; 
private final MouseListener mouseAction = new MouseAdapter() { //i use this to apply the mouse event 
    @Override 
    public void mouseEntered(MouseEvent e) { 
     JMenu item = (JMenu)e.getSource(); //is this implementation correct ? 
     item.setOpaque(true); 
    }; 

    @Override 
    public void mouseExited(MouseEvent e) { 
     JMenu item = (JMenu)e.getSource(); 
     item.setOpaque(false); 
    }; 
}; 


public Menu() { 
    initFileMenu(); 
} 

private void initFileMenu() { 
    JMenu fileMenu = new JMenu("File"); 
    fileMenu.setMnemonic('F'); 
    fileMenu.setRolloverEnabled(true); 

    fileItem_close = new JMenuItem("Close"); 
    fileItem_close.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4, KeyEvent.ALT_MASK)); //exit on pressing (Alt+F4) 
    fileItem_close.addActionListener(this); 

    fileMenu.add(fileItem_close); 
    fileMenu.setRolloverEnabled(true); 
    fileMenu.addMouseListener(mouseAction); 
    fileMenu.setBackground(new Color(0x0066FF)); //The background is not visible as JMenu is not opaque by default. 
    add(fileMenu); 
} 

@Override 
public void actionPerformed(ActionEvent e) { 
    JMenuItem source = (JMenuItem)e.getSource(); 
    if(source == fileItem_close) 
     System.exit(0);  
} 
} 

Код выше не работает, когда я парить над этим заголовком меню ничего не произойдет.
P.S: Я не специалист по графическому интерфейсу.
EDIT:Я использую Nimbus LaF

ответ

4

Вы можете вызвать setSelected() для эффекта парения. И да, ваша реализация e.getSource() была верна. Таким образом, изменить его к этим линиям:

@Override 
public void mouseEntered(MouseEvent e) { 
    JMenu item = (JMenu) e.getSource(); // is this implementation 
             // correct ? 
    item.setSelected(true); 
}; 

@Override 
public void mouseExited(MouseEvent e) { 
    JMenu item = (JMenu) e.getSource(); 
    item.setSelected(false); 
}; 

Если вы хотите, чтобы пункты меню, чтобы выскочить на mouseEntered(), вызовите item.doClick() в методе mouseEntered вместо того, чтобы он выбран.

Edit:

Для настройки:

UIManager.put("Menu.selectionBackground", Color.BLUE); 
UIManager.put("Menu.selectionForeground", Color.WHITE); 
UIManager.put("Menu.background", Color.WHITE); 
UIManager.put("Menu.foreground", Color.BLACK); 
UIManager.put("Menu.opaque", false); 

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

Если вы также хотите сделать это с другими компонентами (например, JMenuItems), взгляните на this. Вы можете найти все значения цветных клавиш UIManager.

Edit 2:

Для Nimbus LAF, создать новый класс:

class FillPainter implements Painter<JComponent> { 

    private final Color color; 

    FillPainter(Color c) { 
     color = c; 
    } 

    @Override 
    public void paint(Graphics2D g, JComponent object, int width, int height) { 
     g.setColor(color); 
     g.fillRect(0, 0, width, height); 
    } 
} 

выше требуется для окраски фона. Теперь это сделать:

for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { 
    if ("Nimbus".equals(info.getName())) { 
     try { 
      UIManager.setLookAndFeel(info.getClassName()); 
      UIManager.getLookAndFeelDefaults().put("MenuBar:Menu[Selected].backgroundPainter", 
        new FillPainter(Color.BLUE)); 
      UIManager.getLookAndFeelDefaults().put("MenuBar:Menu[Selected].textForeground", Color.WHITE); 
      break; 
     } catch (ClassNotFoundException | InstantiationException | IllegalAccessException 
       | UnsupportedLookAndFeelException e) { 
      e.printStackTrace(); 
     } 
     break; 
    } 
} 

Для всех других цветовых значений ключа Nimbus LAF, проверьте this

+0

это работало хорошо, но не дает цвет фона я хочу .. это показывает только выбор по умолчанию цвет. – DaftPunk

+0

@DaftPunk См. Edit –

+0

, который делает это, но как заставить его работать с разными LaFs? (например, Нимбус) – DaftPunk

Смежные вопросы