2015-10-04 7 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]); 
      } 
     }); 
    } 

注:あなたはおそらく、現在のプロジェクトを取得するためのより良い方法があるでしょう、今、私はちょうど1つの開いているプロジェクトがあると仮定します。つまり、私のメソッドは起動時には機能しません(プロジェクトの配列は空です)。

もう1つ注意してください:別のスレッドでshowMyMessageを呼び出していたので、おそらくinvokeLaterでラップする必要はありませんが、私はしました。

+0

誰かが)知っていinvokeLater'が必要である[ドキュメント](http://www.jetbrains.org/。? intelij/sdk/docs/user_interface_components/notifications.html)はそれを言及していません –

+1

@ robin.thoni invokeLater()はスイングメソッドです。実行できる唯一のスレッドであるイベントディスパッチスレッドの下にuiタスクをスタックできますタスク...これはintellij apiよりスイングに関連していますが...ドキュメント内にあってはいけません。 – ALTN

+1

@ Verdagonプロジェクトプロジェクト= 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); 

参照リンク:なぜ `ApplicationManager.getApplication(
1. original link
2. enter link description here

関連する問題