TITLE:JMenuBarの背景に画像を表示する

Posted by terai at 2009-08-10

JMenuBarの背景に画像を表示する

JMenuBarの背景に画像を表示します。

  • &jnlp;
  • &jar;
  • &zip;

#screenshot

サンプルコード

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

解説

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

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

コメント