2012-01-25 2 views
4

Netbeansプラットフォームに基づいてアプリケーションを構築しています。その一部は、使用する特定の言語用のエディタです。NetBeansのHintsControllerとEventQueue

我々は、構文にエラーを強調するために以下のクラスがあります。検索に基づいて

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

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

}

例外をスローする問題のコードは、このです結果は次のように変更されました:

SwingUtilities.invokeLater(new Runnable() { 

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

以下は、構文エラーがエディタで導入されたときに何が起こるかです:HintsControllerはEDT(EventDispatchスレッド)で行われているに

で何が起こる
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) 

、呼び出しがあります。しかし、Annotations.addAnnotation()は別のスレッドで実行されています。「システムクリップボードシンクロナイザ」スレッド、時には「非アクティブなRequestProcessor」スレッドで実行されることもあります。 EDT上で実行されているかどうかをチェックするので、常にIllegalStateExceptionがスローされます。

私はNetbeansプラットフォームの専門家ではありません。会社のこの特定のアプリケーションにはかなり新しいので、本当に明白なものがありません。 Googleはあまり役に立たなかった。誰でも助言がありますか?

+0

コメントとして、このクラスは[Netbeans Wiki](http://wiki.netbeans.org/How_to_create_support_for_a_new_language)のチュートリアルを使用して作成されました。 – Marcelo

+0

このリンクを確認してください。http://netbeans-org.1045718.n5.nabble.com/Illegal-State-Exceptions-EQ-td304381​​7.htmlこの問題はこの記事で解決されています。 –

+1

リンクありがとうございました。janinm、しかしそこの解決策はあまり役に立たなかった。 netbeans-devリストのスレッド:http://netbeans-org.1045718.n5.nabble.com/HintsController-and-EventQueue-td5429770.html – Marcelo

答えて

3

が判明し、それは後のすべてのコードの問題ではありませんでした。

としてはNetBeans-devリストに指摘:

HintsController.setErrorsは、任意のスレッドから呼び出すことができます - それは、その 自身のワーカースレッドを使用し、必要なときにAWTスレッドに再スケジュール。

AWTスレッドでAnnotations.addAnnotationを呼び出すための要件は、 はによってかなりの時間前に削除されました: http://hg.netbeans.org/main-silver/rev/db82e4e0fbcc

同じチェンジもNbDocument.addAnnotationでAWTスレッド に再スケジュール自動削除します。だから、Mavenのpom.xmlファイルを慎重に検討した後

あなたが を使用しているビルドが最初の部分(...)チェンジの第二の部分を持っていますが、いないようだ、私は、アプリケーションがロードされたことに気づきました古いバージョンのモジュールをロードしている間に新しいバージョンのlibsが読み込まれるため、間違ったコードが実行されます。それについての関連する質問here

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); 
      } 
     }); 
    }  
} 
関連する問題