Swing/SystemMenu のバックアップ(No.2)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/SystemMenu へ行く。
- 1 (2021-05-24 (月) 06:14:01)
- 2 (2023-07-16 (日) 11:59:29)
- category: swing folder: SystemMenu title: SystemMenuとして使用されているJMenuを取得する tags: [JRootPane, JMenu, JMenuItem, LookAndFeel] author: aterai pubdate: 2021-05-24T06:11:30+09:00 description: JRootPaneの子コンポーネントを検索してSystemMenuとして使用されているJMenuを取得します。 image: https://drive.google.com/uc?id=17deOtbw1m68IowpoVASZ4QGOeM1WJBnq
概要
JRootPane
の子コンポーネントを検索してSystemMenu
として使用されているJMenu
を取得します。
Screenshot
Advertisement
サンプルコード
JTextArea log = new JTextArea();
EventQueue.invokeLater(() -> {
JMenu menu = descendants(getRootPane())
.filter(JMenu.class::isInstance).map(JMenu.class::cast)
.findFirst().orElse(new JMenu(" "));
menu.add("added to the SystemMenu");
log.append(menu.getPreferredSize() + "\n");
menu.setIcon(UIManager.getIcon("InternalFrame.icon"));
log.append(menu.getPreferredSize() + "\n---\n");
Component c = menu;
while (c != null) {
log.append(c.getClass().getName() + "\n");
c = c.getParent();
}
});
View in GitHub: Java, Kotlin解説
OS
依存のSystemLookAndFeel
ではSystemMenu
はJNI
などを使用しないと取得不可能JFrame.setDefaultLookAndFeelDecorated(true)
でDefaultLookAndFeel
を使用する場合、SystemMenu
は以下のようなコンポーネント階層を辿って取得可能
javax.swing.JFrame
└─javax.swing.JRootPane
└─javax.swing.JLayeredPane
└─javax.swing.plaf.metal.MetalTitlePane
└─javax.swing.plaf.metal.MetalTitlePane$SystemMenuBar
└─javax.swing.JMenu
- 取得した
JMenu
のサイズが小さく、システムアイコンを右クリックしてもシステムメニューがポップアップできない場合がある- 上記のサンプルではシステムアイコンを再設定してクリック可能な領域を拡大している