javafx
WebView और WebEngine
खोज…
टिप्पणियों
WebView
JavaFX Node है जो JavaFX घटक ट्री में एकीकृत है। यह एक WebEngine
प्रबंधन करता है और यह सामग्री प्रदर्शित करता है।
WebEngine
एक अंतर्निहित ब्राउज़र इंजन है, जो मूल रूप से पूरे काम करता है।
एक पृष्ठ लोड हो रहा है
WebView wv = new WebView();
WebEngine we = wv.getEngine();
we.load("https://stackoverflow.com");
WebView
WebEngine
आसपास UI शेल है। एक पृष्ठ के साथ गैर UI बातचीत के लिए लगभग सभी नियंत्रण WebEngine
वर्ग के माध्यम से किया जाता है।
किसी WebView का पृष्ठ इतिहास प्राप्त करें
WebHistory history = webView.getEngine().getHistory();
इतिहास मूल रूप से प्रविष्टियों की एक सूची है। प्रत्येक प्रविष्टि किसी विज़िट किए गए पृष्ठ का प्रतिनिधित्व करती है और यह प्रासंगिक पृष्ठ जानकारी तक पहुँच प्रदान करती है, जैसे कि URL, शीर्षक, और वह पृष्ठ जिस पर अंतिम बार विज़िट किया गया था।
getEntries()
पद्धति का उपयोग करके सूची प्राप्त की जा सकती है। इतिहास और प्रविष्टियों की संबंधित सूची WebEngine
रूप में पूरे वेब में बदल जाती है। ब्राउज़र क्रियाओं के आधार पर सूची का विस्तार या छोटा हो सकता है। इन परिवर्तनों को ऑब्ज़र्वबलिस्ट एपीआई द्वारा सुना जा सकता है जिसे सूची उजागर करती है।
वर्तमान में देखे गए पृष्ठ से जुड़े इतिहास प्रविष्टि के सूचकांक को currentIndexProperty()
द्वारा दर्शाया गया है। वर्तमान इंडेक्स का उपयोग go(int)
विधि का उपयोग करके इतिहास में किसी भी प्रविष्टि को नेविगेट करने के लिए किया जा सकता है। maxSizeProperty()
अधिकतम इतिहास आकार सेट करता है, जो इतिहास सूची का आकार है
नीचे वेब इतिहास आइटम की सूची प्राप्त करने और संसाधित करने के तरीके का एक उदाहरण है।
एक 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();
}
});
जावा अनुप्रयोगों को प्रदर्शित वेब पेज से जावास्क्रिप्ट अलर्ट भेजें।
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 का उपयोग करते समय और इस वेबपेज में जावास्क्रिप्ट होता है, यह वेब पेज में जावा प्रोग्राम और जावास्क्रिप्ट के बीच दो-तरफ़ा संचार स्थापित करने के लिए आवश्यक हो सकता है।
यह उदाहरण दिखाता है कि इस तरह के संचार को कैसे सेटअप किया जाए।
वेबपृष्ठ एक इनपुट फ़ील्ड और एक बटन प्रदर्शित करेगा। बटन पर क्लिक करने पर, इनपुट फ़ील्ड से मूल्य जावा एप्लिकेशन को भेजा जाता है, जो इसे प्रोसेस करता है। प्रसंस्करण के बाद एक परिणाम जावास्क्रिप्ट को भेजा जाता है जो बदले में वेब पेज पर परिणाम प्रदर्शित करता है।
मूल सिद्धांत यह है कि जावास्क्रिप्ट से जावा तक संचार के लिए जावा में एक ऑब्जेक्ट बनाया जाता है जिसे वेबपेज में सेट किया गया है। और दूसरी दिशा के लिए, जावास्क्रिप्ट में एक ऑब्जेक्ट बनाया जाता है और वेबपेज से निकाला जाता है।
निम्नलिखित कोड जावा भाग को दिखाता है, मैंने इसे एक फ़ाइल में रखा है:
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()");
जब toLowerCase(String)
से विधि JavaConnector
कहा जाता है, मूल्य में पारित परिवर्तित है और उसके बाद के माध्यम से वापस भेज दिया javascriptConnector
वस्तु।
और यह html और जावास्क्रिप्ट कोड है:
<!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
कोड को पुनः प्राप्त करने के लिए जावा कोड द्वारा बुलाया गया फ़ंक्शन सिर्फ jsConnector
वस्तु jsConnector
है:
var jsConnector = {
showResult: function (result) {
document.getElementById('result').innerHTML = result;
}
};
function getJsConnector() {
return jsConnector;
};
जावा और जावास्क्रिप्ट के बीच कॉल का तर्क प्रकार स्ट्रिंग्स तक सीमित नहीं है। संभावित प्रकारों और रूपांतरण के बारे में अधिक जानकारी JSObject API डॉक में पाए जाते हैं।