2017-10-30 7 views
0

이 SWTException을 제거하려고 시도했습니다. 잘못된 스레드 액세스입니다. JButton ActionListener 내에서 생성됩니다. 궁극적 인 목적은 ...잘못된 스레드 액세스 : AWT의 SWT ActionListener

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

나는 try/catch로 readAndDispatch를 감싸고 실제로 완벽하게 잘 보이는 것처럼 보일 수 있습니다. 그러나 그건 바람 피는 것처럼 보이고 나중에 나를 다시 붙잡을 것이라고 생각하고있다. –

+0

Display 인스턴스를 Display.getDefault() 대신 새 Display()로 변경하면 오류가 사라지는 것으로 보입니다. 그러나 나는 그것이 왜 그렇게 될지 이해하지 못한다. Display.getCurrent()는 "null"을 반환하므로 활성 스레드는 현재 스레드에 이미 존재합니다 ...? –

답변

1

SWT UI 스레드에서만 SWT 작업을 호출 할 수 있습니다. 다른 곳에 전화하는 것은 지원되지 않습니다.

UI 실행 가능 파일이 완료 될 때까지 기다리려면 asyncExec이 아닌 syncExec을 사용하십시오.

작동하는 것처럼 보일 수도 있지만 플랫폼에 따라 다릅니다. 예를 들어 macOS에서는 완전히 실패 할 것입니다.

+0

그러나 위의 예제에서 UI 액션을 실제로 호출하지는 않습니다. display.readAndDispatch는 호출되는 유일한 메소드이며 UI 업데이트 권한이 아닙니까? –

+1

'Display '와 관련된 것은 UI 액션으로 간주됩니다. 'readAndDispatch'는 보류중인 모든 UI 작업을 실행하므로 UI ​​스레드에서 실행되어야합니다. 'asyncExec'와'syncExec' 만 예외입니다. –