JMenuに追加したJMenuItemなどのテキスト位置を揃える
Total: 3757
, Today: 2
, Yesterday: 0
Posted by aterai at
Last-modified:
概要
JMenu
に追加したJMenuItem
やJLabel
などのコンポーネントのテキスト位置を揃えて表示します。
Screenshot
Advertisement
サンプルコード
// U+200B zero width space
JMenuItem item3 = new JMenuItem("\u200B"); //, HSTRUT);
// item3.setLayout(new BorderLayout());
// item3.setBorder(BorderFactory.createEmptyBorder()); // NimbusLookAndFeel
item3.setEnabled(false);
// item3.setDisabledIcon(HSTRUT);
item3.add(new JMenuItem("JMenuItem(disabled) with JMenuItem", HSTRUT) {
@Override public boolean contains(int x, int y) {
return false; // disable mouse events
}
});
View in GitHub: Java, Kotlin解説
JMenu
やJPopupMenu
にクリック不可の項目としてJMenuItem
の代わりにJLabel
を追加すると、WindowsLookAndFeel
を使用している場合や他のJMenuItem
にアイコンが設定されている場合にテキストの開始位置が揃わないので、これを回避するために以下の方法をテストしています。
JMenuItem.setEnabled(false);
JMenuItem.setEnabled(false);
とUIManager.put("MenuItem.disabledForeground", Color.BLACK);
を使用MenuItem.disabledForeground
が使用されるかどうかはLookAndFeel
に依存
JLabel + EmptyBorder
- 余白を設定した
JLabel
を使用 - 余白の幅は
LookAndFeel
に依存(LookAndFeel
依存の幅を取得する方法がない?)
- 余白を設定した
JPanel with JMenuItem
MenuElement
ではない透明なJPanel
にJComponent#contains()
メソッドをオーバーライドしてマウスクリックを無効にしたJMenuItem
を追加
JMenuItem(disabled) with JMenuItem
JMenuItem.setEnabled(false);
とした空のJMenuItem
にJComponent#contains()
メソッドをオーバーライドしてマウスクリックを無効にしたJMenuItem
を追加
JMenu
にアイコン用の余白がないMetalLookAndFeel
などにアイコンが設定されたJMenuItem
が存在する場合、幅のみのアイコンを設定する必要があるMetalLookAndFeel
の場合、文字列もアイコンも存在しないJMenuItem
は他のJMenuItem
と高さが異なる(幅ゼロ空白文字\u200B
で回避)NimbusLookAndFeel
のJPanel
は、デフォルトでは背景が不透明
参考リンク
- java - JLabel with icon in JPopupMenu doesn't follow other JMenuItem alignment - Stack Overflow
- JDK-8152981 Double icons with JMenuItem setHorizontalTextPosition on Win 10 - Java Bug System
- JCheckBoxMenuItemのチェックアイコンの位置を調整する
Java 8
からCheckBoxMenuItem.afterCheckIconGap
やCheckBoxMenuItem.minimumTextOffset
などが追加されているため、揃えやすくなった