Swing/MenuBarBackground のバックアップ(No.9)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/MenuBarBackground へ行く。
- 1 (2009-08-10 (月) 15:27:32)
- 2 (2010-01-09 (土) 23:08:42)
- 3 (2010-06-10 (木) 15:34:46)
- 4 (2011-05-10 (火) 23:27:28)
- 5 (2011-09-26 (月) 21:12:32)
- 6 (2011-10-11 (火) 17:11:08)
- 7 (2011-10-19 (水) 00:35:36)
- 8 (2011-12-20 (火) 18:08:56)
- 9 (2012-02-28 (火) 21:24:03)
- 10 (2013-01-06 (日) 21:32:50)
- 11 (2013-01-07 (月) 00:33:12)
- 12 (2013-02-26 (火) 19:51:14)
- 13 (2014-11-20 (木) 01:49:24)
- 14 (2014-11-30 (日) 00:52:48)
- 15 (2015-01-25 (日) 18:28:41)
- 16 (2015-04-01 (水) 20:09:52)
- 17 (2015-04-05 (日) 23:10:01)
- 18 (2016-01-17 (日) 02:07:31)
- 19 (2016-07-20 (水) 20:41:36)
- 20 (2016-07-20 (水) 22:02:52)
- 21 (2017-09-27 (水) 19:01:44)
- 22 (2017-10-27 (金) 16:26:13)
- 23 (2017-11-02 (木) 15:38:08)
- 24 (2018-02-24 (土) 19:51:30)
- 25 (2018-05-31 (木) 14:36:14)
- 26 (2020-05-22 (金) 17:41:59)
- 27 (2021-11-10 (水) 12:39:18)
- 28 (2022-08-20 (土) 22:15:25)
- 29 (2024-02-09 (金) 13:57:13)
TITLE:JMenuBarの背景に画像を表示する
Posted by aterai at 2009-08-10
JMenuBarの背景に画像を表示する
JMenuBarの背景に画像を表示します。
- &jnlp;
- &jar;
- &zip;
サンプルコード
public JMenuBar createMenubar() {
final TexturePaint texture = makeTexturePaint();
JMenuBar mb = new JMenuBar() {
@Override protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.setPaint(texture);
g2.fillRect(0, 0, getWidth(), getHeight());
}
};
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();
};
};
if("Windows XP".equals(System.getProperty("os.name"))) {
menu.setBackground(new Color(0,0,0,0)); //XXX Windows XP 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 には対応していない- Windows LnF に切り替えた直後、メニューの文字色などがおかしい?
JFrame#setJMenuBar()で追加したJMenuBarを透明にする場合のテスト(NimbusLnF)
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
public class MenuBarRootPaneTest{
private static JMenuBar createMenubar() {
JMenuBar mb = new JMenuBar();
mb.setOpaque(false);
mb.setBackground(new Color(0,0,0,0));
String[] menuKeys = {"File", "Edit", "Help"};
for(String key: menuKeys) {
JMenu m = createMenu(key);
if(m != null) mb.add(m);
}
return mb;
}
private static JMenu createMenu(String key) {
JMenu menu = new JMenu(key);
menu.setForeground(Color.WHITE);
menu.add("dummy1"); menu.add("dummy2"); menu.add("dummy3");
return menu;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
createAndShowGUI();
}
});
}
public static void createAndShowGUI() {
try {
for (UIManager.LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels())
if ("Nimbus".equals(laf.getName()))
UIManager.setLookAndFeel(laf.getClassName());
}catch(Exception e) {
e.printStackTrace();
}
JFrame frame = new JFrame();
frame.getRootPane().setBackground(Color.RED);
//frame.getLayeredPane().setBackground(Color.GREEN);
//frame.getContentPane().setBackground(Color.BLUE);
((JComponent)frame.getContentPane()).setOpaque(false);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setJMenuBar(createMenubar());
frame.setSize(320, 240);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
コメント
- 選択状態を半透明にするテスト -- aterai
import java.awt.*; import java.awt.event.*; import java.awt.image.*; import java.awt.geom.*; import javax.swing.*; public class MenuBarBackgroundTest { public JComponent makeUI() { final TexturePaint texture = makeTexturePaint(); JPanel p = new JPanel(new BorderLayout()) { @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; g2.setPaint(texture); g2.fillRect(0, 0, getWidth(), getHeight()); } }; p.setOpaque(false); p.add(createMenubar(), BorderLayout.NORTH); return p; } public static JMenuBar createMenubar() { UIManager.put("Menu.background", new Color(200,0,0,0)); UIManager.put("Menu.selectionBackground", new Color(0,0,100,100)); UIManager.put("Menu.selectionForeground", new Color(200,0,0)); UIManager.put("Menu.useMenuBarBackgroundForTopLevel", Boolean.TRUE); JMenuBar mb = new JMenuBar() { private final TexturePaint texture = makeTexturePaint(); @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; g2.setPaint(texture); g2.fillRect(0, 0, getWidth(), getHeight()); } }; mb.setOpaque(false); mb.setOpaque(false); for(String key: new String[] {"File", "Edit", "Help"}) { JMenu m = createMenu(key); if(m != null) mb.add(m); } return mb; } private static JMenu createMenu(String key) { final JMenu menu = new JMenu(key); menu.add("dummy1"); menu.add("dummy2"); menu.add("dummy3"); return menu; } private static TexturePaint makeTexturePaint() { int cs = 6, sz = cs*cs; BufferedImage img = new BufferedImage(sz,sz,BufferedImage.TYPE_4BYTE_ABGR); Graphics2D g2 = img.createGraphics(); g2.setPaint(new Color(200,150,100,50)); g2.fillRect(0,0,sz,sz); for(int i=0; i*cs<sz; i++) { for(int j=0; j*cs<sz; j++) { if((i+j)%2==0) g2.fillRect(i*cs, j*cs, cs, cs); } } g2.dispose(); return new TexturePaint(img, new Rectangle(0,0,sz,sz)); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { createAndShowGUI(); } }); } public static void createAndShowGUI() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch(Exception e) { e.printStackTrace(); } JFrame frame = new JFrame(); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.getContentPane().add(new MenuBarBackgroundTest().makeUI()); frame.setSize(320,240); frame.setLocationRelativeTo(null); frame.setVisible(true); } }
- Windows7 のLnFでうまくいかない場合があるようなので、すこし修正。 -- aterai