有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java NetBeans的HintController和EventQueue

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

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

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 () {
}

}

引发异常的违规代码如下:

org.netbeans.spi.editor.hints.HintsController.setErrors (document, "testsequence", errors);

根据搜索结果,更改为以下内容:

SwingUtilities.invokeLater(new Runnable() {

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

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

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)

发生的情况是,调用是在EDT(EventDispatch线程)中进行的HintController。但是,注释是无效的。addAnnotation()正在另一个线程中运行—有时在“系统剪贴板同步器”线程中运行,有时在“非活动RequestProcessor”线程中运行。因为它检查是否在EDT上运行,所以它总是抛出一个非法状态异常

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


共 (2) 个答案

  1. # 1 楼答案

    也许您应该尝试使用以下方法更新错误:

    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);
                }
           });
        }    
    }
    
  2. # 2 楼答案

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

    正如NetBeans-dev清单所指出的:

    HintsController.setErrors can be called from any thread - it uses its own worker thread, and reschedules to AWT thread when necessary.

    The requirement to invoke Annotations.addAnnotation in AWT thread has been removed quite some time ago by: http://hg.netbeans.org/main-silver/rev/db82e4e0fbcc

    The same changeset also removed automatic rescheduling into AWT thread in NbDocument.addAnnotation. So it seems that the build you are using has the second part of the changeset, but not the first part (...)

    在仔细检查maven的pom.xml文件之后,我意识到应用程序正在加载较新版本的libs,而模块正在加载较旧版本,因此它将运行错误的代码。关于here的相关问题