2013-06-04 2 views
2

JavaFX에 대해 더 알고 싶습니다. 그래서 Webview를 설정하려고했습니다. Oracle 웹 사이트에서 webview 예제를 복사하고 Upcall 기능을 추가했습니다. 하지만 작동하지 않습니다. 사실 Webview에서 웹 사이트를 디버깅하는 방법을 모르겠습니다.자바 스크립트를 JavaFX로 업 그레 이브

package boersensim; 

import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.geometry.HPos; 
import javafx.geometry.VPos; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.Priority; 
import javafx.scene.layout.Region; 
import javafx.scene.paint.Color; 
import javafx.scene.web.WebEngine; 
import javafx.scene.web.WebView; 
import javafx.stage.Stage; 
import netscape.javascript.JSObject; 


public class Main extends Application { 
private Scene scene; 
@Override public void start(Stage stage) { 
    // create the scene 
    stage.setTitle("Web View"); 
    scene = new Scene(new Browser(),750,500, Color.web("#666970")); 
    stage.setScene(scene); 
    //scene.getStylesheets().add("webviewsample/BrowserToolbar.css"); 
    stage.show(); 
} 

public static void main(String[] args){ 
    launch(args); 
} 
} 
class Browser extends Region { 

final WebView browser = new WebView(); 
final WebEngine webEngine = browser.getEngine(); 

public Browser() { 
    //apply the styles 
    getStyleClass().add("browser"); 
    // load the web page 
    webEngine.load("test.html"); 
    //add the web view to the scene 
    getChildren().add(browser); 

    JSObject jsobj = (JSObject) webEngine.executeScript("window"); 
    jsobj.setMember("java", new Bridge()); 
} 
private Node createSpacer() { 
    Region spacer = new Region(); 
    HBox.setHgrow(spacer, Priority.ALWAYS); 
    return spacer; 
} 

@Override protected void layoutChildren() { 
    double w = getWidth(); 
    double h = getHeight(); 
    layoutInArea(browser,0,0,w,h,0, HPos.CENTER, VPos.CENTER); 
} 

@Override protected double computePrefWidth(double height) { 
    return 750; 
} 

@Override protected double computePrefHeight(double width) { 
    return 500; 
} 
} 

class Bridge { 
public void exit() { 
    //Platform.exit(); 
    System.out.print("Hello!UPCALL"); 
} 
} 

corrosponding의 HTML은 다음과 같습니다 :

Click<a href="#" onclick="java.exit();">here</a>to exit the application 

나는 링크 아무 일도 발생하지 클릭하면 그래서 여기에 자바 코드입니다. 사전에 당신에게

감사합니다, 다니엘

답변

3

페이지로드 이벤트에 브리지()

webEngine.setJavaScriptEnabled(true); 
webEngine.getLoadWorker().stateProperty().addListener(
      new ChangeListener<Worker.State>() { 
       public void changed(ObservableValue ov, Worker.State oldState, Worker.State newState) { 
        if (newState == Worker.State.SUCCEEDED) {       
         JSObject jso = (JSObject) webEngine.executeScript("window"); 
         jso.setMember("java", new Bridge()); 
        } 

       } 
      }); 
2

나는 또한이 튜토리얼 (당신이 사용 아마도 한) 다음으로 설정 : https://blogs.oracle.com/javafx/entry/communicating_between_javascript_and_javafx

을 그리고 JVM 충돌을 일으킨다는 것을 알게되었습니다. 그래서 JavaFX jira에 관한 문제를보고했습니다. 다음 답변을 받았습니다 :

7u5부터 JS에서 호출 된 메서드는 Java 의미로 액세스 할 수 있어야합니다. 즉, 공용 클래스의 공용 멤버입니다. (이것은 기사에 대한 마지막 코멘트에서 언급했다). 이> 특정 테스트 케이스에서는 브리지를 공용 클래스로 선언해야합니다.

JDK8에서 충돌이 수정되었습니다. 이제 예외가 발생합니다.

그러면 작동합니다.

+0

나는이 응답을 3 시간 전에 보았습니다! * public * 수정자를 사용하지 않고 정적 내부 클래스 *를 가졌으며 JVM이 충돌합니다. 클래스에 'public'을 추가하면 이제 작동합니다. 고맙습니다! – metasim

관련 문제