Swing/TranslucentPopupMenu のバックアップ(No.13)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/TranslucentPopupMenu へ行く。
- 1 (2012-02-27 (月) 14:25:17)
- 2 (2012-07-04 (水) 20:54:31)
- 3 (2012-07-05 (木) 11:43:54)
- 4 (2012-08-10 (金) 19:22:39)
- 5 (2012-08-15 (水) 13:55:37)
- 6 (2012-08-15 (水) 15:31:11)
- 7 (2012-10-17 (水) 16:59:17)
- 8 (2012-10-22 (月) 17:02:28)
- 9 (2012-12-13 (木) 15:29:35)
- 10 (2012-12-25 (火) 18:47:59)
- 11 (2014-11-01 (土) 00:46:09)
- 12 (2014-11-21 (金) 01:19:13)
- 13 (2014-11-26 (水) 02:25:42)
- 14 (2014-12-04 (木) 14:42:22)
- 15 (2015-04-08 (水) 17:12:36)
- 16 (2016-06-01 (水) 18:53:40)
- 17 (2017-09-07 (木) 21:40:17)
- 18 (2018-02-24 (土) 19:51:30)
- 19 (2019-02-22 (金) 20:29:44)
- 20 (2020-12-09 (水) 01:33:04)
- 21 (2022-08-20 (土) 22:15:25)
- 22 (2022-10-04 (火) 15:50:47)
- title: JPopupMenuを半透明にする tags: [JPopupMenu, JMenuItem, JWindow, Translucent] author: aterai pubdate: 2012-02-27T14:25:17+09:00 description: JPopupMenu自体の背景を透明に設定し、別途JPopupMenu#paintComponent(...)をオーバーライドして半透明の背景を描画します。
概要
JPopupMenu
自体の背景を透明に設定し、別途JPopupMenu#paintComponent(...)
をオーバーライドして半透明の背景を描画します。
Screenshot
Advertisement
サンプルコード
class TranslucentPopupMenu extends JPopupMenu {
private static final Color ALPHA_ZERO = new Color(0, true);
private static final Color POPUP_BACK = new Color(250, 250, 250, 200);
private static final Color POPUP_LEFT = new Color(230, 230, 230, 200);
private static final int LEFT_WIDTH = 24;
@Override public boolean isOpaque() {
return false;
}
@Override public void updateUI() {
super.updateUI();
if (UIManager.getBorder("PopupMenu.border") == null) {
setBorder(new BorderUIResource(BorderFactory.createLineBorder(Color.GRAY)));
}
}
@Override public JMenuItem add(JMenuItem menuItem) {
menuItem.setOpaque(false);
//menuItem.setBackground(ALPHA_ZERO);
return super.add(menuItem);
}
@Override public void show(Component c, int x, int y) {
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
Window p = SwingUtilities.getWindowAncestor(TranslucentPopupMenu.this);
if (p instanceof JWindow) {
System.out.println("Heavy weight");
JWindow w = (JWindow) p;
w.setBackground(ALPHA_ZERO);
} else {
System.out.println("Light weight");
}
}
});
super.show(c, x, y);
}
@Override protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g.create();
g2.setPaint(POPUP_LEFT);
g2.fillRect(0, 0, LEFT_WIDTH, getHeight());
g2.setPaint(POPUP_BACK);
g2.fillRect(LEFT_WIDTH, 0, getWidth(), getHeight());
g2.dispose();
//super.paintComponent(g);
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、JPopupMenu
は、isOpaque()
メソッドをオーバーライド、JMenuItemはsetOpaque(false)
として、それぞれ透明に設定し、JPopupMenu#paintComponent(...)
で、半透明の背景を描画しています。
JPopupMenu
が親フレームの外にはみ出す場合は、Heavyweight
のJWindow
を使ってJPopupMenu
が表示されるので、JWindow#setBackground(new Color(0, true))
で(JDK 1.6.0_10
では、com.sun.awt.AWTUtilities.setWindowOpaque(w, false)
)、JPopupMenu#show(...)
が呼ばれるたびに、毎回(親フレームの透明度を引き継がないように?)JWindow
自体を透明にしています。
- メモ:
JPopupMenu
(ルート)がLight weight
で、そのJMenu
から開くJPopupMenu
(サブメニュー) がHeavy weight
のときに半透明にならない