JPopupMenuを半透明にする
Total: 5396
, Today: 1
, Yesterday: 0
Posted by aterai at
Last-modified:
概要
JPopupMenu
自体の背景を透明に設定し、別途そのpaintComponent(...)
メソッドをオーバーライドして半透明の背景を描画します。
Screenshot
Advertisement
サンプルコード
class TranslucentPopupMenu extends JPopupMenu {
private static final Color ALPHA_ZERO = new Color(0x0, 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(0x0, true))
で(JDK 1.6.0_10
ではcom.sun.awt.AWTUtilities.setWindowOpaque(w, false)
)、JPopupMenu#show(...)
が呼ばれるたびに毎回(親フレームの透明度を引き継がないように?)JWindow
自体を透明にしています。
JPopupMenu
(ルート)がLight weight
でそのJMenu
から開くJPopupMenu
(サブメニュー) がHeavy weight
のときに半透明にならない