앞선 포스팅에서는 SWT Browser 에서 Javascript 수행결과를 얻는 방법으로는 다음의 첫번째 방법을 포스팅 하였는데, 이번 포스팅에서는 두번째 방법에 대해 자세히 알아 보도록 한다.

  • Browser 의 public Object evaluate (String script) 함수를 이용한 리턴값을 이용하는 방법
  • Javascript 핸들러로 org.eclipse.swt.browser.BrowserFunction 을 확장구현한 클래스를 Browser 에 등록하는 방법

 두번째 방법은 SWT Browser(org.eclipse.swt.browser.Browser)에서 Javascript Function Callback 을 등록하고, Browser 에서 등록된 Javascript Function 이 호출될경우 리턴값을 Java 에서 계속 핸들링 할 수 있는 방법이다.


 main.js 파일에 Java 에서 Callback 으로 사용될 함수 javaFunction 함수를 선언해둔다. 이함수는 Javascript 에서 Java 를 호출하는 함수로 Argument 와 함께 호출 할 수 있다.


 Main.Java 파일에서는 SWT Browser 의 callback 으로 사용될 클래스를 구현해야하는데 org.eclipse.swt.browser.BrowserFunction 클래스를 상속받아야한다.

 BrowserFunction 클래스를 상속받아 구현할때 function 함수에서는 arguments 로 Javascript 에서 전달한 Argument 가 전달되어 오고, 비지니스로직 수행후 Javascript 로 다시 return 값을 전달 할 수 있다.

 BrowserFunction 확장 클래스를 구현후 다음과 같이 SWT Browser 와 Javascript Callbck 을 등록해줘야한다.

new CustomFunction (browser, "javaFunction");


// main.js
function sendToJava() {
    var result;
    try {
        result = javaFunction("javascript argument");
    } catch (e) {
        return;
    }
    for (var i = 0; i < result.length; i++) {
         alert( result[i] );
    }
}


// Main.java

final Browser browser = new Browser(parent, SWT.NONE);
browser.setText( "...skip..." ); // skip html content

final BrowserFunction function = new CustomFunction (browser, "javaFunction");

static class CustomFunction extends BrowserFunction {
    CustomFunction (Browser browser, String name) {
        super (browser, name);
    }
    public Object function (Object[] arguments) {
        Object returnValue = new Object[] {
                "Java Argument",
        };
        return returnValue;
    }
}


이와 같이 수행하면 SWTBrowser 에서 Push to invoke Java 버튼을 누를경우 Javascript 의 SendToJava() 함수가 호출되고 내부에서

Java 의 javaFunction 함수가 "javascript argument" 인자와 함께 호출되어 "Java Argument" 라는 리턴값을 Javascript 로 다시넘겨주게된다.




참고


Posted by leechwin