수색…


비고

WebView 는 JavaFX 구성 요소 트리에 통합 된 JavaFX 노드입니다. WebEngine 관리하고 그 내용을 표시합니다.

WebEngine 은 기본적으로 전체 작업을 수행하는 기본 브라우저 엔진입니다.

페이지로드

WebView wv = new WebView();
WebEngine we = wv.getEngine();
we.load("https://stackoverflow.com");

WebViewWebEngine 주변의 UI 셸입니다. 페이지와의 비 UI 상호 작용을위한 거의 모든 컨트롤은 WebEngine 클래스를 통해 수행됩니다.

WebView의 페이지 기록 가져 오기

WebHistory history = webView.getEngine().getHistory();

이력은 기본적으로 항목 목록입니다. 각 항목은 방문한 페이지를 나타내며 URL, 제목 및 페이지가 마지막으로 방문한 날짜와 같은 관련 페이지 정보에 대한 액세스를 제공합니다.

이 목록은 getEntries() 메소드를 사용하여 얻을 수 있습니다. WebEngine 이 웹을 탐색 할 때 기록 및 해당 항목 목록이 변경됩니다. 브라우저 동작에 따라 목록이 확장되거나 축소 될 수 있습니다. 이러한 변경 사항은 목록에서 노출되는 ObservableList API에서 수신 할 수 있습니다.

현재 방문한 페이지와 연관된 히스토리 항목의 색인은 currentIndexProperty() 표시됩니다. 현재 색인은 go(int) 메소드를 사용하여 히스토리의 모든 항목을 탐색하는 데 사용될 수 있습니다. maxSizeProperty() 는 히스토리 목록의 크기 인 최대 히스토리 크기를 설정합니다.

다음은 웹 기록 항목 목록얻고 처리하는 방법의 예입니다.

ComboBox (comboBox)는 기록 항목을 저장하는 데 사용됩니다. WebHistory 에서 ListChangeListener 를 사용하면 ComboBox 가 현재 WebHistory 업데이트됩니다. ComboBox 에는 선택한 페이지로 리디렉션되는 EventHandler 가 있습니다.

final WebHistory history = webEngine.getHistory();

comboBox.setItems(history.getEntries());
comboBox.setPrefWidth(60);
comboBox.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent ev) {
        int offset =
                comboBox.getSelectionModel().getSelectedIndex()
                - history.getCurrentIndex();
        history.go(offset);
    }
});

history.currentIndexProperty().addListener(new ChangeListener<Number>() {

    @Override
    public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
        // update currently selected combobox item
        comboBox.getSelectionModel().select(newValue.intValue());
    }
});

// set converter for value shown in the combobox:
//   display the urls
comboBox.setConverter(new StringConverter<WebHistory.Entry>() {

    @Override
    public String toString(WebHistory.Entry object) {
        return object == null ? null : object.getUrl();
    }

    @Override
    public WebHistory.Entry fromString(String string) {
        throw new UnsupportedOperationException();
    }
});

표시된 웹 페이지에서 Javascript 경고를 Java 응용 프로그램 로그로 보냅니다.

private final Logger logger = Logger.getLogger(getClass().getCanonicalName());

WebView webView = new WebView();
webEngine = webView.getEngine();

webEngine.setOnAlert(event -> logger.warning(() -> "JS alert: " + event.getData())); 

웹 페이지에서 자바 앱과 자바 스크립트 간의 통신

WebView를 사용하여 사용자 정의 웹 페이지를 표시 할 때이 웹 페이지에 Javascript가 포함되어 있으면 Java 프로그램과 웹 페이지의 Javascript 사이에 양방향 통신을 설정해야 할 수 있습니다.

이 예에서는 이러한 통신을 설정하는 방법을 보여줍니다.

웹 페이지는 입력 필드와 버튼을 표시해야합니다. 버튼을 클릭하면 입력 필드의 값이 처리되는 Java 응용 프로그램으로 전송됩니다. 처리 후 결과는 웹 페이지에 결과를 표시하는 Javascript로 전송됩니다.

기본 원칙은 Javascript에서 Java 로의 통신을 위해 객체가 웹 페이지로 설정된 Java로 작성된다는 것입니다. 그리고 다른 방향으로, 객체는 자바 스크립트로 만들어지고 웹 페이지에서 추출됩니다.

다음 코드는 Java 파트를 보여 주며 모든 파일을 하나의 파일에 보관했습니다.

package com.sothawo.test;

import javafx.application.Application;
import javafx.concurrent.Worker;
import javafx.scene.Scene;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import netscape.javascript.JSObject;

import java.io.File;
import java.net.URL;

/**
 * @author P.J. Meisch ([email protected]).
 */
public class WebViewApplication extends Application {

    /** for communication to the Javascript engine. */
    private JSObject javascriptConnector;

    /** for communication from the Javascript engine. */
    private JavaConnector javaConnector = new JavaConnector();;

    @Override
    public void start(Stage primaryStage) throws Exception {
        URL url = new File("./js-sample.html").toURI().toURL();

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

        // set up the listener
        webEngine.getLoadWorker().stateProperty().addListener((observable, oldValue, newValue) -> {
            if (Worker.State.SUCCEEDED == newValue) {
                // set an interface object named 'javaConnector' in the web engine's page
                JSObject window = (JSObject) webEngine.executeScript("window");
                window.setMember("javaConnector", javaConnector);

                // get the Javascript connector object. 
                javascriptConnector = (JSObject) webEngine.executeScript("getJsConnector()");
            }
        });

        Scene scene = new Scene(webView, 300, 150);
        primaryStage.setScene(scene);
        primaryStage.show();

        // now load the page
        webEngine.load(url.toString());
    }

    public class JavaConnector {
        /**
         * called when the JS side wants a String to be converted.
         *
         * @param value
         *         the String to convert
         */
        public void toLowerCase(String value) {
            if (null != value) {
                javascriptConnector.call("showResult", value.toLowerCase());
            }
        }
    }
}

페이지가로드되면 JavaConnector 객체 (내부 클래스에 의해 정의되고 필드로 생성 됨)가 다음 호출에 의해 웹 페이지에 설정됩니다.

JSObject window = (JSObject) webEngine.executeScript("window");
window.setMember("javaConnector", javaConnector);

javascriptConnector 객체는 다음과 같은 웹 페이지에서 가져옵니다.

javascriptConnector = (JSObject) webEngine.executeScript("getJsConnector()");

JavaConnectortoLowerCase(String) 메서드가 호출되면 전달 된 값이 변환 된 다음 javascriptConnector 객체를 통해 다시 전송됩니다.

그리고 이것은 html과 javascript 코드입니다 :

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Sample</title>
    </head>
    <body>
        <main>
    
            <div><input id="input" type="text"></div>
            <button onclick="sendToJava();">to lower case</button>
            <div id="result"></div>
    
        </main>
    
        <script type="text/javascript">
            function sendToJava () {
                var s = document.getElementById('input').value;
                javaConnector.toLowerCase(s);
            };
    
            var jsConnector = {
                showResult: function (result) {
                    document.getElementById('result').innerHTML = result;
                }
            };
    
            function getJsConnector() {
                return jsConnector;
            };
        </script>
    </body>
</html>

sendToJava 함수는 Java 코드에 의해 설정된 JavaConnector 의 메소드를 호출합니다.

function sendToJava () {
    var s = document.getElementById('input').value;
    javaConnector.toLowerCase(s);
};

javascriptConnector 를 검색하기 위해 Java 코드에서 호출하는 함수는 jsConnector 객체를 반환합니다.

var jsConnector = {
    showResult: function (result) {
        document.getElementById('result').innerHTML = result;
    }
};
    
function getJsConnector() {
    return jsConnector;
};

Java와 Javascript 사이의 호출의 인수 유형은 문자열에 국한되지 않습니다. 가능한 유형 및 변환에 대한 자세한 정보는 JSObject API 문서에 있습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow