TITLE:JMenuBarの背景に画像を表示する
#navi(../)
RIGHT:Posted by [[terai]] at 2009-08-10
*JMenuBarの背景に画像を表示する [#wd4f8033]
JMenuBarの背景に画像を表示します。

-&jnlp;
-&jar;
-&zip;

#screenshot

**サンプルコード [#d260e806]
#code{{
public JMenuBar createMenubar() {
  final TexturePaint texture = makeTexturePaint();
  JMenuBar mb = new JMenuBar() {
    @Override protected void paintComponent(Graphics g) {
      Graphics2D g2 = (Graphics2D)g;
      g2.setPaint(texture);
      g2.fillRect(0, 0, getWidth(), getHeight());
      super.paintComponent(g);
    }
  };
  mb.setOpaque(false);
  String[] menuKeys = {"File", "Edit", "Help"};
  for(String key: menuKeys) {
    JMenu m = createMenu(key);
    if(m != null) mb.add(m);
  }
  return mb;
}
private JMenu createMenu(String key) {
  JMenu menu = new JMenu(key) {
    @Override protected void fireStateChanged() {
      ButtonModel m = getModel();
      if(m.isPressed() && m.isArmed()) {
        setOpaque(true);
      }else if(m.isSelected()) {
        setOpaque(true);
      }else if(isRolloverEnabled() && m.isRollover()) {
        setOpaque(true);
      }else{
        setOpaque(false);
      }
      super.fireStateChanged();
    };
  };
  menu.setBackground(new Color(0,0,0,0)); //XXX windows lnf?
  menu.add("dummy1"); menu.add("dummy2"); menu.add("dummy3");
  return menu;
}
}}

**解説 [#xdc98524]
上記のサンプルでは、JMenuBarに画像を描画し、これに追加するJMenuを通常は透明、選択されたときなどは不透明となるようにsetOpaqueメソッドで切り替えています。

-注意点
--Windows LnF の場合、JMenu#setBackground(new Color(0,0,0,0)); とする必要がある?
--Nimbus LnF には対応していない

//**参考リンク
**コメント [#z71d0296]
#comment