如何在SWT菜单项文本中保留@字符
解决SWT/JFace菜单中@字符被替换为空格的问题
问题原因
JFace的Action类会对文本进行助记符解析,在Windows环境下的部分配置中,@会被识别为助记符相关的特殊标记,导致显示时被替换为空格。
解决方法
方法1:双@转义(最简单)
将Action文本中的单个@替换为两个@@,JFace会自动将双@解析为单个@显示:
private class MyAction extends Action { public MyAction() { super("xyz@@gmail.com"); } @Override public void run() { // code to execute } }
方法2:手动设置MenuItem文本
如果转义无效,可以绕过Action的文本处理逻辑,直接获取对应的MenuItem并设置原始文本:
protected MenuManager createMenuManager() { MenuManager menuBar = new MenuManager(); MenuManager myMenu = new MenuManager("Menu"); Action myAction = new MyAction(); myMenu.add(myAction); // 创建菜单后手动修正文本 Menu menu = myMenu.createMenu(getShell()); for (MenuItem item : menu.getItems()) { if ("xyz gmail.com".equals(item.getText())) { item.setText("xyz@gmail.com"); break; } } menuBar.add(myMenu); return menuBar; }
方法3:自定义MenuCreator
通过实现IMenuCreator完全控制MenuItem的创建,确保文本原样显示:
private class MyAction extends Action { public MyAction() { super(); setMenuCreator(new IMenuCreator() { @Override public Menu getMenu(Control parent) { return createMenuItem(parent); } @Override public Menu getMenu(Menu parent) { return createMenuItem(parent); } private Menu createMenuItem(Object parent) { Menu menu; if (parent instanceof Control) { menu = new Menu((Control) parent); } else { menu = new Menu((Menu) parent); } MenuItem item = new MenuItem(menu, SWT.PUSH); item.setText("xyz@gmail.com"); item.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { run(); } }); return menu; } @Override public void dispose() { // 按需清理菜单资源 } }); } @Override public void run() { // code to execute } }
内容的提问来源于stack exchange,提问作者altralaser
相关产品推荐
相关产品推荐

