You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 08:44:59