首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NetBeans的HintsController和EventQueue

NetBeans的HintsController和EventQueue
EN

Stack Overflow用户
提问于 2012-01-25 17:09:45
回答 2查看 781关注 0票数 4

我们正在构建一个基于Netbeans平台的应用程序,其中一部分是我们使用的特定语言的编辑器。

我们有以下类来突出显示语法中的错误:

代码语言:javascript
复制
class SyntaxErrorsHighlightingTask extends org.netbeans.modules.parsing.spi.ParserResultTask {

public SyntaxErrorsHighlightingTask () {
}

@Override
public void run (org.netbeans.modules.parsing.spi.Parser.Result result, org.netbeans.modules.parsing.spi.SchedulerEvent event) {
    try {
        final javax.swing.text.Document document = result.getSnapshot().getSource ().getDocument(false);
        final List<ErrorDescription> errors = new ArrayList<ErrorDescription> ();
        // finds errors on the document and add them to 'errors' list
        }

        /***
        OFFENDING CODE GOES HERE
        ***/

    } catch (javax.swing.text.BadLocationException ex1) {
        org.openide.util.Exceptions.printStackTrace (ex1);
    } catch (org.netbeans.modules.parsing.spi.ParseException ex1) {
        Exceptions.printStackTrace (ex1);
    }
}

@Override
public int getPriority () {
    return 100;
}

@Override
public Class<? extends Scheduler> getSchedulerClass () {
    return Scheduler.EDITOR_SENSITIVE_TASK_SCHEDULER;
}

@Override
public void cancel () {
}

}

抛出异常的违规代码如下:

代码语言:javascript
复制
org.netbeans.spi.editor.hints.HintsController.setErrors (document, "testsequence", errors);

根据搜索结果,将其更改为:

代码语言:javascript
复制
SwingUtilities.invokeLater(new Runnable() {

                @Override
                public void run() {
                     System.err.println("is EDT? " + SwingUtilities.isEventDispatchThread());
                     HintsController.setErrors (document, "testsequence", errors);
                }
           });

以下是在编辑器中引入语法错误时会发生的情况:

代码语言:javascript
复制
is EDT? true
SEVERE [org.openide.util.RequestProcessor]: Error in RequestProcessor org.netbeans.spi.editor.hints.HintsController$1
java.lang.IllegalStateException: Must be run in EQ
    at org.netbeans.editor.Annotations.addAnnotation(Annotations.java:195)
    at org.netbeans.modules.editor.NbEditorDocument.addAnnotation(NbEditorDocument.java:251)
    at org.openide.text.NbDocument.addAnnotation(NbDocument.java:504)
    at org.netbeans.modules.editor.hints.AnnotationHolder$NbDocumentAttacher.attachAnnotation(AnnotationHolder.java:235)
    at org.netbeans.modules.editor.hints.AnnotationHolder.attachAnnotation(AnnotationHolder.java:208)
    at org.netbeans.modules.editor.hints.AnnotationHolder.updateAnnotationOnLine(AnnotationHolder.java:674)
    at org.netbeans.modules.editor.hints.AnnotationHolder.setErrorDescriptionsImpl(AnnotationHolder.java:899)
    at org.netbeans.modules.editor.hints.AnnotationHolder.access$1300(AnnotationHolder.java:113)
    at org.netbeans.modules.editor.hints.AnnotationHolder$4.run(AnnotationHolder.java:812)
    at org.netbeans.editor.BaseDocument.render(BaseDocument.java:1409)
    at org.netbeans.modules.editor.hints.AnnotationHolder.setErrorDescriptions(AnnotationHolder.java:809)
    at org.netbeans.modules.editor.hints.HintsControllerImpl.setErrorsImpl(HintsControllerImpl.java:111)
    at org.netbeans.modules.editor.hints.HintsControllerImpl.setErrors(HintsControllerImpl.java:93)
    at org.netbeans.spi.editor.hints.HintsController$1.run(HintsController.java:79)
    at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1424)
    at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:1968)
Caused: org.openide.util.RequestProcessor$SlowItem: task failed due to
    at org.openide.util.RequestProcessor.post(RequestProcessor.java:425)
    at org.netbeans.spi.editor.hints.HintsController.setErrors(HintsController.java:77)
    at com.#.#.#.editor.parser.SyntaxErrorsHighlightingTask$1.run(SyntaxErrorsHighlightingTask.java:74)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:641)
    at java.awt.EventQueue.access$000(EventQueue.java:84)
    at java.awt.EventQueue$1.run(EventQueue.java:602)
    at java.awt.EventQueue$1.run(EventQueue.java:600)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:611)
    at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:148)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
[catch] at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

发生的情况是,对HintsController的调用是在EDT (EventDispatch线程)中进行的。然而,Annotations.addAnnotation()正在另一个线程中运行--有时是在“系统剪贴板同步器”线程中,有时是在“非活动RequestProcessor”线程中。因为它检查它是否在EDT上运行,所以它总是抛出一个IllegalStateException。

我不是使用Netbeans平台的专家,而且我对公司的这个特定应用程序非常陌生-所以我可能遗漏了一些非常明显的东西。谷歌帮不了多少忙。有人有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-02 18:37:33

事实证明,这毕竟不是代码的问题。

正如NetBeans-dev列表中所指出的:

HintsController.setErrors可以从任何线程调用-它使用自己的工作线程,并在必要时重新调度到AWT线程。

在AWT线程中调用Annotations.addAnnotation的要求在很长一段时间以前已经被:http://hg.netbeans.org/main-silver/rev/db82e4e0fbcc删除了

相同的变更集还删除了NbDocument.addAnnotation中自动重新调度到awt线程的功能。因此,您正在使用的构建似乎具有变更集的第二部分,但没有第一部分(...)

仔细查看maven的pom.xml文件后,我意识到应用程序加载的是较新版本的库,而模块加载的是较旧的版本,因此它会运行错误的代码。关于那个here的相关问题。

票数 3
EN

Stack Overflow用户

发布于 2012-01-30 18:23:48

也许你应该尝试用下面这样的方法来更新你的错误:

代码语言:javascript
复制
private void updateError(javax.swing.text.Document document, List<ErrorDescription> errors) {
    if(javax.swing.SwingUtilities.isEventDispatchThread()) {
        HintsController.setErrors (document, "testsequence", errors);
    }
    else {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                 HintsController.setErrors (document, "testsequence", errors);
            }
       });
    }    
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9000093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档