Swing/MenuItemTextAlignment のバックアップの現在との差分(No.2)
- category: swing folder: MenuItemTextAlignment title: JMenuに追加したJMenuItemなどのテキスト位置を揃える tags: [JMenuBar, JMenu, JMenuItem, LookAndFeel] author: aterai pubdate: 2016-07-18T01:53:49+09:00 description: JMenuに追加したJMenuItemやJLabelなどのコンポーネントのテキスト位置を揃えて表示します。 image:
概要
JMenu
に追加したJMenuItem
やJLabel
などのコンポーネントのテキスト位置を揃えて表示します。
Screenshot
Advertisement
サンプルコード
#spanadd
// U+200B zero width space
#spanend
JMenuItem item3 = new JMenuItem("\u200B"); //, HSTRUT);
#spandel
//item3.setLayout(new BorderLayout());
#spanend
#spandel
//item3.setBorder(BorderFactory.createEmptyBorder()); //NimbusLookAndFeel
#spanend
#spanadd
// item3.setLayout(new BorderLayout());
#spanend
#spanadd
// item3.setBorder(BorderFactory.createEmptyBorder()); // NimbusLookAndFeel
#spanend
item3.setEnabled(false);
#spandel
//item3.setDisabledIcon(HSTRUT);
#spanend
#spanadd
// item3.setDisabledIcon(HSTRUT);
#spanend
item3.add(new JMenuItem("JMenuItem(disabled) with JMenuItem", HSTRUT) {
@Override public boolean contains(int x, int y) {
return false; //disable mouse events
return false; // disable mouse events
}
});
View in GitHub: Java, Kotlin解説
JMenu
やJPopupuMenu
にクリック不可の項目としてJMenuItem
の代わりにJLabel
を追加すると、WindowsLookAndFeel
を使用している場合や他のJMenuItem
にアイコンが設定されている場合に、テキストの開始位置が揃わないので、これを回避するために以下の方法をテストしています。
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
を追加 -
MenuElement
ではない透明なJPanel
にJComponent#contains()
メソッドをオーバーライドしてマウスクリックを無効にしたJMenuItem
を追加
-
JMenuItem(disabled) with JMenuItem
-
JMenuItem.setEnabled(false);
とした空のJMenuItem
に、JComponent#contains()
メソッドをオーバーライドしてマウスクリックを無効にした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
- 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
などが追加されているため、揃えやすくなった
-