SystemMenuとして使用されているJMenuを取得する
Total: 1431
, Today: 3
, Yesterday: 3
Posted by aterai at
Last-modified:
概要
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
のサイズが小さく、システムアイコンを右クリックしてもシステムメニューがポップアップできない場合がある- 上記のサンプルではシステムアイコンを再設定してクリック可能な領域を拡大している