Swing/LightWeightPopupEnabled のバックアップ(No.3)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/LightWeightPopupEnabled へ行く。
- 1 (2024-10-28 (月) 00:26:05)
- 2 (2024-10-28 (月) 11:34:02)
- 3 (2024-11-03 (日) 20:00:53)
- category: swing folder: LightWeightPopupEnabled title: JPopupMenuを常に重量ポップアップで開く tags: [JPopupMenu, JComboBox, GlassPane] author: aterai pubdate: 2024-10-28T00:23:44+09:00 description: JPopupMenuの表示位置で軽量・重量ポップアップを切り替えるのではなく、常に重量ポップアップを使用するよう設定します。 image: https://drive.google.com/uc?id=1KmwoXwsLYnuC6X7xH9rlxYl4GBkeP8QH
概要
JPopupMenu
の表示位置で軽量・重量ポップアップを切り替えるのではなく、常に重量ポップアップを使用するよう設定します。
Screenshot
Advertisement
サンプルコード
JPopupMenu popup0 = makePopupMenu();
// popup0.setLightWeightPopupEnabled(true); // Default
JLabel label0 = makeLabel("setLightWeightPopupEnabled: true", Color.ORANGE);
label0.setComponentPopupMenu(popup0);
JPopupMenu popup1 = makePopupMenu();
popup1.setLightWeightPopupEnabled(false);
JLabel label1 = makeLabel("setLightWeightPopupEnabled: false", Color.PINK);
label1.setComponentPopupMenu(popup1);
JComponent glass = new JPanel(new GridLayout(3, 1, 10, 10)) {
private final Color backgroundColor = new Color(0x64_64_64_C8, true);
@Override protected void paintComponent(Graphics g) {
g.setColor(backgroundColor);
g.fillRect(0, 0, getWidth(), getHeight());
super.paintComponent(g);
}
};
glass.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
glass.setOpaque(false);
glass.add(label0);
glass.add(label1);
View in GitHub: Java, Kotlin解説
- JComboBox#setLightWeightPopupEnabled(boolean)
GlassPane
に配置されたJComboBox
のドロップダウンリスト全体が親JFrame
内で表示可能で軽量ポップアップが使用されるとGlassPane
の奥に表示されるJComboBox
で使用するドロップダウンリスト(javax.swing.plaf.basic.BasicComboPopup
はJPopupMenu
を継承)にJComboBox#setLightWeightPopupEnabled(false)
を指定することでそのドロップダウンリストが常に重量ポップアップで開くよう設定
- JPopupMenu#setLightWeightPopupEnabled(boolean)
GlassPane
に配置されたコンポーネントにJComponent#setComponentPopupMenu(...)
で設定されたJPopupMenu
全体が親JFrame
内で表示可能で軽量ポップアップが使用されるとGlassPane
の奥に表示されるJPopupMenu
にJPopupMenu#setLightWeightPopupEnabled(false)
を指定してそれが常に重量ポップアップとして開くよう設定
Java 9
以降では以下のようにPopupFactory#getPopup(...)
をオーバーライドすることでJMenuBar
、JToolTip
、JComboBox
、JPopupMenu
などすべてで重量ポップアップの使用を強制可能
// Java 9:
PopupFactory.setSharedInstance(new PopupFactory() {
@Override public Popup getPopup(Component owner, Component contents, int x, int y) throws IllegalArgumentException {
// @param isHeavyWeightPopup true if Popup should be heavy-weight,
// protected Popup getPopup(..., boolean isHeavyWeightPopup) ...
return super.getPopup(owner, contents, x, y, true);
}
});
参考リンク
- JPopupMenu#setLightWeightPopupEnabled(boolean)
- JComboBox#setLightWeightPopupEnabled(boolean)
- JToolTipをGlassPane上のコンポーネントで表示する