2017-10-30 5 views
0

このSWTExceptionを取り除こうとしています:無効なスレッドアクセスです。 JButtonのActionListener内から生成されます。究極の目的は...無効なスレッドアクセス:AWTのActionListenerのSWT

private static final Display display = Display.getDefault(); 

// Fired from JButton: 
class ShowBrowserAction implements java.awt.event.ActionListener { 

    @Override 
    public void actionPerformed(ActionEvent e) { 

     // Place-holder UI Update... 
     display.asyncExec(new Runnable() { 
      public void run() { 
       System.out.println("Async task run"); 
      } 
     }); 

     // Blocking until UI element is done... 
     while (!display.isDisposed()) { 
      // Always gives a thread access error, but still calls async event: 
      if (!display.readAndDispatch() ) 
       display.sleep(); 
     } 

    } 
} 

思考を、ボタンがブラウザウィンドウを開くことですURLに移動してからURLを開く]ダイアログに戻されますか?

+0

私はreadAndDispatchをtry/catchで囲むことができ、実際は完全にうまくいくようです。しかし、それは不正行為のように思われ、私は後で私に襲われると思います。 –

+0

Display.getDefault()の代わりに新しいDisplay()の表示インスタンスを変更すると、エラーが消えてしまうようです。しかし、私はそれがなぜ起こるのか理解していない。 Display.getCurrent()は "null"を返します。アクティブなDisplayは現在のスレッドに既に存在していません。 –

答えて

1

SWTアクションは、SWT UIスレッドでのみ呼び出すことができます。それらをどこにでも呼び出すことはサポートされていません。

UI実行可能ファイルが完了するのを待つ場合は、asyncExecではなくsyncExecを使用してください。

これはうまくいくと思われますが、これはプラットフォームによって異なります。たとえば、macOSでは、完全に失敗するでしょう。

+0

しかし、上記の例では、実際にUIアクションを呼び出すわけではありませんか? display.readAndDispatchは呼び出されている唯一のメソッドであり、UIの更新権限ではありませんか? –

+1

'Display'と関係があるものはUIアクションとしてカウントされます。 'readAndDispatch'は保留中のすべてのUI操作を実行するので、UIスレッドで実行する必要があります。 'asyncExec'と' syncExec'だけが例外です。 –

関連する問題