2012-05-29 1 views
1

다음과 같이 내 문제는 다음과 같습니다애플릿 내에서 스윙 UI와 함께 작동 할 수 없습니다 - 공공 메소드를 호출

<input id="btnAppletSelectFiles" type="button" value="Select Files" 
    onclick="document.appletExcelUploader.SelectFiles();" /> 

: 나는 HTML 페이지에 포함 된 JApplet 및 애플릿의 공개 방법의 JS 호출과 form 버튼이 있습니다 내 JApplet에에 내가 좋아하는 FileChooser 있습니다

public class ExcelUploader extends JApplet { 

    private JFileChooser fc = new JFileChooser(); 
    // Some stuff 
} 

그리고 나는 내 애플릿의 공개 방법과 같은 코드를 쓰고 있어요 :

public void SelectFiles() { 
     int retVal = fc.showOpenDialog(ControlsPanel.this); 

     if (retVal == JFileChooser.APPROVE_OPTION) { 
      for (File file : fc.getSelectedFiles()) { 
       System.out.println(file.getName()); 
      } 
     } 
    } 
,

HTML 단추를 클릭하면 파일 대화 상자가 정상적으로 표시됩니다. 디렉토리를 탐색하고 파일을 검사 할 수는 있지만 누를 수는 없습니다. 열기 또는 OK 버튼 -이 파일을 클릭해도 대화 상자가 유지됩니다.

스레드에 문제가 있다고 생각합니다. 여전히 "HTML 및 JS"스레드에서 수행하고 내 애플릿의 GUI 스레드 또는 이벤트 발송 스레드에서는 수행하지 않습니다.

문제를 해결하는 방법?

+0

하지만 애플릿 안에 버튼을 추가하고 거기에서 대화를 호출하면 모든 것이 정상입니다. –

+0

- 자바 코드가 서명 된 그대로 애플릿 업로드가 작동합니다. - JS 브라우저 스레드가 UI가있는 애플릿에 액세스하여 작동을 멈 춥니 다. - 애플릿이 브라우저 스레드에서 실행됩니다. - 논리적으로 보이는 모든 스레드에 대해 브라우저 보안이 동일하면 , 문제는 –

답변

1

JavaScript에서 호출 된 신뢰할 수있는 애플릿의 메소드는 Java가 스택의 모든 코드 프레임을 고려할 수 없으므로 더 이상 신뢰할 수 없습니다. 문제를 해결하려면 오버로드 된 메서드 AccessController.doPrivileged(..) 중 하나를 사용하십시오.

+0

덕분에 코드가 오히려 이상하게 보이는 스레드 간 통신을하지만 지금은 '의 AccessController.doPrivileged (새 PrivilegedAction를 () { 공공 문자열 실행() { 시도 { SwingUtilities.invokeAndWait (새 Runnable를 작동() { public void run() { controls.selectFiles() ; } }); } catch (Exception e) { logger.error (e.getMessage(), e); } return "42"; } }) ' –

+0

다행히 분류 했으니 까. :) –