2015-10-04 72 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