【问题标题】:How do I show a notification in IntelliJ?如何在 IntelliJ 中显示通知?
【发布时间】:2015-10-04 00:39:07
【问题描述】:

想出了如何在屏幕右上角显示这些小通知气泡消息之一,请在下面回答。

【问题讨论】:

    标签: java intellij-idea intellij-plugin


    【解决方案1】:

    事实证明,您必须创建一个 NotificationGroup 实例,然后使用它来创建一个通知,并将通知和项目传递给 Notifications.Bus.notify()。

    public class VoiceApplicationComponentImpl implements ApplicationComponent, VoiceApplicationComponent {
        ...
        public static final NotificationGroup GROUP_DISPLAY_ID_INFO =
            new NotificationGroup("My notification group",
                NotificationDisplayType.BALLOON, true);
        ...
        void showMyMessage(String message) {
            ApplicationManager.getApplication().invokeLater(new Runnable() {
                @Override
                public void run() {
                    Notification notification = GROUP_DISPLAY_ID_INFO.createNotification(message, NotificationType.ERROR);
                    Project[] projects = ProjectManager.getInstance().getOpenProjects();
                    Notifications.Bus.notify(notification, projects[0]);
                }
            });
        }
    

    注意:您可能有更好的方法来获取当前项目,现在我只是假设有一个打开的项目。这意味着我的方法在启动时不起作用(项目数组为空)。

    另一个注意事项:您可能不需要使用 invokeLater 进行包装,但我这样做了,因为我在不同的线程中调用 showMyMessage。

    【讨论】:

    • 有人知道为什么ApplicationManager.getApplication().invokeLater 是必要的吗?doc 没有提到它
    • @robin.thoni invokeLater() 是一个swing方法,它允许在事件调度线程下堆叠ui任务,这是唯一允许执行ui任务的线程......这与虽然摆动比 intellij api...不应该在文档中。
    • @Verdagon 您应该使用 Project project = e.getData(LangDataKeys.PROJECT) 来获取您当前的项目参考,否则当多个项目打开时,通知可能会显示在错误的项目下。 e 是您从动作类中获得的 AnActionEvent。还要确保从 invokeLater runnable 中调用 e.getData(LangDataKeys.PROJECT) ,否则在运行时会抛出异常。由于某种原因,intellij 不允许在事件调度线程下调用 getData。
    【解决方案2】:

    这样会更好!

    StatusBar statusBar = WindowManager.getInstance()
        .getStatusBar(DataKeys.PROJECT.getData(actionEvent.getDataContext()));
    
    JBPopupFactory.getInstance()
        .createHtmlTextBalloonBuilder(htmlText, messageType, null)
        .setFadeoutTime(7500)
        .createBalloon()
        .show(RelativePoint.getCenterOf(statusBar.getComponent()),
                                                 Balloon.Position.atRight);
    

    参考链接:
    1. original link
    2. enter link description here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多