2015-10-04 36 views

回答

11

原来,您必须制作一个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。

+0

是否有人知道为什么'ApplicationManager.getApplication()invokeLater'是必要的[商务部](http://www.jetbrains.org/ intellij/sdk/docs/user_interface_components/notifications.html)没有提到它 –

+1

@ robin.thoni invokeLater()是一个swing方法,它允许在事件分派线程下堆叠ui任务,这是唯一允许执行的线程ui任务...这与swing比intellij api更相关,尽管...不应该在文档中。 – ALTN

+1

@Verdagon您应该使用Project project = e.getData(LangDataKeys.PROJECT)来获取您当前的项目参考,否则当多个项目打开时,通知有风险显示在错误的项目下。 e是您从行动课程中获得的AnActionEvent。还要确保你调用invokeLater可运行的e.getData(LangDataKeys.PROJECT),否则将在运行时抛出异常。出于某种原因,intellij不允许在事件派发线程下调用getData。 – ALTN

0

这样会更好!

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