JAVAFX 2.0 javascript中调用java代码
现在你已经知道如何在JavaFX中调用JavaScript。在本章中,你将了解到相反的功能——在web页面中调用JavaFX。
大体上的理念是在JavaFX程序中创建一个接口对象,并通过调用JSObject.setMember()方法使它对JavaScript可见。然后你就可以在JavaScript中调用该对象的public方法、访问public属性了。
6.1 使用JAVASCRIPT指令退出JAVAFX程序
首先,在help.html文件中再添加一行:<p><a href=”about:blank”
onclick=”app.exit()”>Exit the Application</a></p>。通过点击help.html文件中的“Exit the Application”链接,用户就可以退出WebViewSample程序。如例6-1中展示的那样修改程序来实现这个功能。
例6-1 通过使用JavaScript来关闭JavaFX程序
import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Worker.State;
import javafx.event.ActionEvent;
import javafx.geometry.HPos;
import javafx.geometry.Pos;
import javafx.geometry.VPos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Hyperlink;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
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 WebViewSample extends Application { private Scene scene; @Override
public void start(Stage stage) {
// create scene
stage.setTitle("Web View Sample");
scene = new Scene(new Browser(stage), 900, 600, Color.web("#666970"));
stage.setScene(scene);
// apply CSS style
scene.getStylesheets().add("webviewsample/BrowserToolbar.css");
// show stage
stage.show();
} public static void main(String[] args) {
launch(args);
}
} class Browser extends Region { private final HBox toolBar;
final private static String[] imageFiles = new String[]{
"product.png",
"blog.png",
"documentation.png",
"partners.png",
"help.png"
};
final private static String[] captions = new String[]{
"Products",
"Blogs",
"Documentation",
"Partners",
"Help"
};
final private static String[] urls = new String[]{
"http://www.oracle.com/products/index.html",
"http://blogs.oracle.com/",
"http://docs.oracle.com/javase/index.html",
"http://www.oracle.com/partners/index.html",
WebViewSample.class.getResource("help.html").toExternalForm()
};
final ImageView selectedImage = new ImageView();
final Hyperlink[] hpls = new Hyperlink[captions.length];
final Image[] images = new Image[imageFiles.length];
final WebView browser = new WebView();
final WebEngine webEngine = browser.getEngine();
final Button toggleHelpTopics = new Button("Toggle Help Topics");
private boolean needDocumentationButton = false; public Browser(final Stage stage) {
//apply the styles
getStyleClass().add("browser"); for (int i = 0; i < captions.length; i++) {
// create hyperlinks
Hyperlink hpl = hpls[i] = new Hyperlink(captions[i]);
Image image = images[i]
= new Image(getClass().getResourceAsStream(imageFiles[i]));
hpl.setGraphic(new ImageView(image));
final String url = urls[i];
final boolean addButton = (hpl.getText().equals("Help")); // process event
hpl.setOnAction((ActionEvent e) -> {
needDocumentationButton = addButton;
webEngine.load(url);
}); } // create the toolbar
toolBar = new HBox();
toolBar.setAlignment(Pos.CENTER);
toolBar.getStyleClass().add("browser-toolbar");
toolBar.getChildren().addAll(hpls);
toolBar.getChildren().add(createSpacer()); //set action for the button
toggleHelpTopics.setOnAction((ActionEvent t) -> {
webEngine.executeScript("toggle_visibility('help_topics')");
}); // process page loading
webEngine.getLoadWorker().stateProperty().addListener(
(ObservableValue<? extends State> ov, State oldState,
State newState) -> {
toolBar.getChildren().remove(toggleHelpTopics);
if (newState == State.SUCCEEDED) {
JSObject win
= (JSObject) webEngine.executeScript("window");
win.setMember("app", new JavaApp());
if (needDocumentationButton) {
toolBar.getChildren().add(toggleHelpTopics);
}
}
}); // load the home page
webEngine.load("http://www.oracle.com/products/index.html"); //add components
getChildren().add(toolBar);
getChildren().add(browser);
} // JavaScript interface object
public class JavaApp { public void exit() {
Platform.exit();
}
} private Node createSpacer() {
Region spacer = new Region();
HBox.setHgrow(spacer, Priority.ALWAYS);
return spacer;
} @Override
protected void layoutChildren() {
double w = getWidth();
double h = getHeight();
double tbHeight = toolBar.prefHeight(w);
layoutInArea(browser,0,0,w,h-tbHeight,0,HPos.CENTER,VPos.CENTER);
layoutInArea(toolBar,0,h-tbHeight,w,tbHeight,0,HPos.CENTER,VPos.CENTER);
} @Override
protected double computePrefWidth(double height) {
return 900;
} @Override
protected double computePrefHeight(double width) {
return 600;
}
}
检查例6-1中的粗体代码。JavaApp接口的exit()方法是public的,因此它可以被外部访问。这个方法被调用的时候,就会终止JavaFX程序的运行。
例6-1中的JavaApp接口被设置为JSObject实例的一个成员,因此JavaScript就知道了该接口。在JavaScript中该接口的名称是window.app或者直接就是app,它唯一能被JavaScript调用的方法就是app.exit()。
当你编译、运行WebViewSample程序并点击Help图标,Exit the Application链接会出现在页面底部,如图6-1所示。
图6-1 Exit Application链接

检查文件的内容,然后点击例6-1中的Exit the Application链接来关闭WebViewSample程序。
JAVAFX 2.0 javascript中调用java代码的更多相关文章
- 在scala中调用java代码
详细代码请见https://github.com/lujinhong/scalademo 在scala中调用java代替非常非常简单,直接调用即可 (一)一个简单示例 1.创建一个java类 pa ...
- PL/SQL程序中调用Java代码(转)
主要是学习PL/SQL调用JAVA的方法. 平台:WINDOWS 1.首先使用IDE写好需要调用的java代码,再添加"create or replace and compile java ...
- 在Python程序中调用Java代码的实现
<原创不易,转载请标明出处:https://www.cnblogs.com/bandaobudaoweng/p/10785766.html> 前言 开发Python程序,需求中需要用到Ja ...
- [CefSharp] 如何在JavaScript中调用C#代码
本例在WinForms下实现,具体流程与WPF一致. 本例仅供调用示例,不代表正常业务书写流程. 1. 创建WinForms项目,并将项目属性设置为x86平台 此处预先设置,避免引用时报错,再花更多的 ...
- 如何在Java中调用Python代码
有时候,我们会碰到这样的问题:与A同学合作写代码,A同学只会写Python,而不会Java, 而你只会写Java并不擅长Python,并且发现难以用Java来重写对方的代码,这时,就不得不想方设法“调 ...
- 在Java中调用Python代码
极少数时候,我们会碰到类似这样的问题:与A同学合作写代码, A同学只会写Python,不熟悉Java ,而你只会写Java不擅长Python,并且发现难以用Java来重写对方的代码,这时,就不得不想方 ...
- ios中javascript直接调用oc代码而非通过改变url回调方式(转)
之前一个ios项目中,需要通过UIWebview来打开一个静态页面,并在静态页面中 调用相关object-c代码. 一.以前使用js调用object-c的方法 关于如何使用javascript调用ob ...
- kettle中调用java类
kettle中调用java类 有时须要在kettle调用java类,如:验证.查询或自己定义加密等.有时甚至连主要的数据訪问都不那么简单,如获取一个存储文件或使用一个数据库连接,某些数据源可能封装在应 ...
- 如何实现 javascript “同步”调用 app 代码
在 App 混合开发中,app 层向 js 层提供接口有两种方式,一种是同步接口,一种一异步接口(不清楚什么是同步的请看这里的讨论).为了保证 web 流畅,大部分时候,我们应该使用异步接口,但是某些 ...
随机推荐
- Java中的方法重载
一.什么是方法重载? 方法重载就是两个或多个方法的方法名相同,但是方法的形参类型,数量,顺序不同. 上面提到的三点也就是一个方法的特征标,只要有一点不相同,则该方法就不相同,就可以实现重载. 在这里的 ...
- Unity调用Windows对话框保存时另存为弹框
Unity开发VR之Vuforia 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...
- matlab学习(2) sort、sortrows
1.sort函数 对于向量,sort(X)把向量的元素按照从小到大排序: 对于矩阵,sort(X)按照从小到大顺序对矩阵每一列进行排序:sort(X,2)按照行排序 对于字符串的元胞数组,sort(X ...
- 读书笔记--More Effective C++--效率(总结)
PS: 本文只是总结,具体内容需要去查看More Effective C++--效率部分. 1. 80—20准则 大约 20%的代码使用了 80%的程序资源:大约 20%的代码耗用了大约 80%的运行 ...
- 05 面向对象:构造方法&static&继承&方法 &final
构造方法及其重载: /* 构造方法格式特点 * a:方法名与类名相同(大小也要与类名一致) * b:没有返回值类型,连void都没有 * c:没有具体的返回值return; * 构造方法的重载 * 重 ...
- EasyUI datagrid combox onchange 五
$("#sTwo").combobox({ onChange: function (n,o) { n改变后,o改变前 }
- 构建工具 buildtool
一.什么是build tool? 构建工具是从源代码自动创建可执行应用程序的程序.构建包括将代码编译,链接和打包成可用或可执行的形式.在小项目中,开发人员通常会手动调用构建过程.这对于较大的项目来说是 ...
- poj 2155 B - Matrix 二维树状数组
#include<iostream> #include<string> #include<string.h> #include<cstdio> usin ...
- 20165313 《Java程序设计》第四周学习总结
教材学习总结 public:1.用在类前.2.用在方法前 .3. 用在成员变量前 private:用在成员变量前 final1.用在类前2.用在方法前3.用在成员变量前 static:1.所有对象公有 ...
- hdu1159 dp(最长公共子序列)
题意:给两个字符串,求这两个字符串的最长公共子序列的长度 因为之前集训的时候做过,所以现在即使会做也并不是什么稀奇的事,依旧为了自己的浅薄感到羞愧啊``` 解法就是通过两个字符串的每个字符互相比较,根 ...