2015-10-04 9 views

उत्तर

11

बाहर निकलता है, आपको अधिसूचना समूह उदाहरण बनाना है, और उसके बाद अधिसूचना बनाने के लिए इसका उपयोग करें, और अधिसूचना और परियोजनाओं को अधिसूचनाएं पास करें। 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/Notes.html) इसका उल्लेख नहीं है –

+1

@ robin.thoni invokeLater() एक स्विंग विधि है, यह इवेंट प्रेषण थ्रेड के तहत UI कार्यों को ढेर करने की अनुमति देता है जो निष्पादित करने की अनुमति देने वाला एकमात्र धागा है ui कार्य ... यह इंटेलिज एपीआई से स्विंग से अधिक संबंधित है हालांकि ... दस्तावेज़ों में नहीं होना चाहिए। – ALTN

+1

@ वेरडागन आपको अपने वर्तमान प्रोजेक्ट संदर्भ प्राप्त करने के लिए प्रोजेक्ट प्रोजेक्ट = e.getData (LangDataKeys.PROJECT) का उपयोग करना चाहिए, अन्यथा अधिसूचनाओं को गलत प्रोजेक्ट के तहत दिखाने के लिए जोखिम होता है जब कई प्रोजेक्ट खुले होते हैं। ई AnctionEvent है जो आप अपनी एक्शन क्लास के भीतर से प्राप्त करते हैं। यह भी सुनिश्चित करें कि आप invokeLater से बाहर e.getData (LangDataKeys.PROJECT) को कॉल करें, अन्यथा रनटाइम पर एक अपवाद फेंक दिया जाएगा। किसी कारण से इंटेलिज ईवेंट प्रेषण धागे के तहत कॉल को प्राप्त करने की अनुमति नहीं देता है। – 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

संबंधित मुद्दे