2015-10-04 19 views

cevap

11

Bir NotificationGroup örneği oluşturmanız ve sonra bir Bildirim yapmak için bunu kullanın ve bildirimi ve Projeyi Notifications.Bus.notify() öğesine iletmeniz gerekir.

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

Not: Şu anki Projeyi almanın daha iyi bir yolu olacak, şu anda sadece bir tane açık proje olduğunu farz ediyorum. Bu, yöntemimin başlangıçta çalışmadığı anlamına gelir (projeler dizisi boş).

Başka bir not: muhtemelen invokeLater ile sarmak zorunda değilsiniz, ancak farklı bir iş parçacığı içinde showMyMessage çağırıyordum çünkü yaptım.

+0

'ApplicationManager.getApplication() invokeLater' neden gerekli olduğunu kimse biliyor mu [doc] (http://www.jetbrains.org/ intellij/sdk/docs/user_interface_components/notifications.html) bundan bahsetmiyor –

+1

@ robin.thoni invokeLater() bir salıncak yöntemidir, yürütme için izin verilen tek iş parçacığı olan olay gönderme iş parçacığı altında ui görevlerinin biriktirilmesine izin verir ui görevleri ... bu, intellij api'den daha çok swing ile ilgili olsa da ... doc'larda olmamalı. – ALTN

+1

@Verdagon, mevcut proje başvurunuzu almak için Project project = e.getData (LangDataKeys.PROJECT) kullanmanız gerekir, aksi halde bildirim birden fazla proje açık olduğunda yanlış projenin altında görünebilir. e, aksiyon sınıfınızdan aldığınız AnActionEvent'tir. Ayrıca, invokeLater runnable öğesinden e.getData (LangDataKeys.PROJECT) öğesini çağırdığınızdan emin olun, aksi takdirde çalışma zamanında bir istisna atılır. Bazı nedenlerden dolayı intellij, olay dağıtım iş parçacığı altında çağrının getData'ya izin vermez. – ALTN

0

Bu daha iyi olacak!

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); 

referans linki:.?
1. original link
2. enter link description here

İlgili konular