2015-10-04 13 views

risposta

11

Si scopre che è necessario creare un'istanza NotificationGroup e quindi utilizzarla per effettuare una notifica e passare la notifica e il progetto a 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]); 
      } 
     }); 
    } 

Nota: probabilmente avrete un modo migliore per ottenere il progetto in corso, in questo momento ho solo supporre c'è un progetto aperto. Questo significa che il mio metodo non funziona all'avvio (la matrice dei progetti è vuota).

Un'altra nota: probabilmente non è necessario eseguire il wrapping con invokeLater, ma l'ho fatto, perché stavo chiamando showMyMessage in un thread diverso.

+0

Qualcuno sa il motivo per cui 'ApplicationManager.getApplication() invokeLater' è necessario La [doc] (http://www.jetbrains.org/ intellij/sdk/docs/user_interface_components/notifications.html) non lo menziona –

+1

@ robin.thoni invokeLater() è un metodo swing, consente di impilare le attività ui sotto il thread di invio dell'evento, che è l'unico thread consentito per l'esecuzione ui compiti ... questo è più legato allo swing di intellij api però ... non dovrebbe essere nei documenti. – ALTN

+1

@Verdagon dovresti usare Project project = e.getData (LangDataKeys.PROJECT) per ottenere il tuo riferimento al progetto corrente, altrimenti la notifica rischia di apparire sotto il progetto sbagliato quando sono aperti più progetti. e è l'AnActionEvent che ottieni dalla tua action class. Assicurati inoltre di chiamare e.getData (LangDataKeys.PROJECT) fuori dal runnable invokeLater, altrimenti verrà generata un'eccezione in fase di runtime. Per qualche ragione intellij non consente la chiamata a getData sotto il thread di invio dell'evento. – ALTN

0

questo andrà meglio! collegamento di riferimento

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