Swing/MenuItemAcceleratorAlignment のバックアップ(No.9)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/MenuItemAcceleratorAlignment へ行く。
- 1 (2013-09-30 (月) 05:06:53)
- 2 (2013-09-30 (月) 08:44:45)
- 3 (2013-09-30 (月) 20:19:55)
- 4 (2013-10-02 (水) 15:47:10)
- 5 (2014-02-22 (土) 18:12:24)
- 6 (2014-02-23 (日) 19:44:41)
- 7 (2014-05-22 (木) 14:31:29)
- 8 (2014-09-17 (水) 02:25:23)
- 9 (2014-10-23 (木) 00:54:03)
- 10 (2014-10-29 (水) 20:21:44)
- 11 (2014-11-01 (土) 00:46:09)
- 12 (2014-11-18 (火) 16:20:43)
- 13 (2014-11-21 (金) 18:11:05)
- 14 (2014-11-25 (火) 03:03:31)
- 15 (2015-12-19 (土) 17:36:34)
- 16 (2016-05-10 (火) 16:29:33)
- 17 (2016-05-30 (月) 16:43:19)
- 18 (2016-05-31 (火) 14:30:01)
- 19 (2016-11-18 (金) 15:02:12)
- 20 (2017-11-02 (木) 15:34:40)
- 21 (2017-11-24 (金) 14:39:42)
- 22 (2018-02-24 (土) 19:51:30)
- 23 (2018-02-26 (月) 17:54:52)
- 24 (2020-03-06 (金) 16:28:57)
- 25 (2021-07-18 (日) 22:49:23)
- 26 (2022-08-20 (土) 22:15:25)
- 27 (2023-11-13 (月) 06:47:34)
- title: JMenuItemのAccelerator表示を右揃えにする tags: [JMenuItem, Locale, KeyEvent, ResourceBundle, Alignment] author: aterai pubdate: 2013-09-30T05:06:53+09:00 description: JMenuItemのAccelerator表示を右揃えに変更します。
概要
JMenuItem
のAccelerator
表示を右揃えに変更します。
Screenshot
Advertisement
サンプルコード
public static void paintAccText(
Graphics g, MenuItemLayoutHelper lh, MenuItemLayoutHelper.LayoutResult lr,
Color disabledForeground, Color acceleratorForeground,
Color acceleratorSelectionForeground) {
if(!lh.getAccText().equals("")) {
ButtonModel model = lh.getMenuItem().getModel();
g.setFont(lh.getAccFontMetrics().getFont());
if(!model.isEnabled()) {
// *** paint the accText disabled
if(disabledForeground != null) {
g.setColor(disabledForeground);
SwingUtilities2.drawString(
lh.getMenuItem(), g, lh.getAccText(),
lr.getAccRect().x,
lr.getAccRect().y + lh.getAccFontMetrics().getAscent());
}else{
g.setColor(lh.getMenuItem().getBackground().brighter());
SwingUtilities2.drawString(
lh.getMenuItem(), g, lh.getAccText(),
lr.getAccRect().x,
lr.getAccRect().y + lh.getAccFontMetrics().getAscent());
g.setColor(lh.getMenuItem().getBackground().darker());
SwingUtilities2.drawString(
lh.getMenuItem(), g, lh.getAccText(),
lr.getAccRect().x - 1,
lr.getAccRect().y + lh.getFontMetrics().getAscent() - 1);
}
}else{
// *** paint the accText normally
if(model.isArmed() ||
(lh.getMenuItem() instanceof JMenu && model.isSelected())) {
g.setColor(acceleratorSelectionForeground);
}else{
g.setColor(acceleratorForeground);
}
SwingUtilities2.drawString(
lh.getMenuItem(), g, lh.getAccText(),
//lr.getAccRect().x, >>>
lh.getViewRect().x + lh.getViewRect().width
- lh.getMenuItem().getIconTextGap() - lr.getAccRect().width,
//<<<
lr.getAccRect().y + lh.getAccFontMetrics().getAscent());
}
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、BasicMenuItemUI#paintMenuItem(...)
メソッドをオーバーライドして、JMenuItem
のAccelerator
を左寄せではなく、右寄せで表示するように変更しています。
- 注
Web Start
で実行するとjava.security.AccessControlException: access denied ("java.lang.RuntimePermission" "accessClassInPackage.sun.swing")
と例外が発生してメニューが表示されないsun.swing.MenuItemLayoutHelper
や、sun.swing.MenuItemLayoutHelper.LayoutResult
などの内部所有のAPI
を使用しているので、今後も使用できるか不明paintText(...)
、paintCheckIcon(...)
、paintIcon(...)
、paintArrowIcon(...)
などのBasicMenuItemUI
のプライベートなメソッドをほぼそのままコピーして使用しているComponentOrientation.RIGHT_TO_LEFT
が設定されて、文字列が右から左に配置される場合は考慮していない
JMenuItem
のAccelerator
が、JMenuItem#setLocale(Locale.ENGLISH)
としても変化しないJDK 1.7.0
からLocale.getLocale()
がLocale.JAPAN
などの場合、KeyEvent#getKeyText(...)
で取得できる文字列が翻訳されている- 例:
Space
が「スペース」
- 例:
- KeyEvent#getKeyText(int) (Java Platform SE 7)では、「これらの文字列は
awt.properties
ファイルを変更することによりローカライズが可能です。」となっているが、%JAVA_HOME%/jre/lib/rt.jar
内にsun/awt/resources/awt.class
などの優先順位が高いクラスがあるため、awt_ja.properties
などを作成しても読み込まれない-Xbootclasspath/p:
などで、rt.jar
より先に以下のようなsun.awt.resources.awt_ja.class
を読み込むよう指定
package sun.awt.resources;
import java.util.ListResourceBundle;
//ant package
//cd target
//"%JAVA_HOME%\bin\java" -Xbootclasspath/p:example.jar -jar example.jar
public class awt_ja extends ListResourceBundle {
@Override protected Object[][] getContents() {
System.out.println("---- awt_ja ----");
return new Object[][] { { "AWT.space", "XXXXX" } };
}
}