文档章节

javaFX与js交互

天高地厚宇宙无穷
 天高地厚宇宙无穷
发布于 2016/08/20 13:57
字数 449
阅读 589
收藏 3

1、javafx直接执行html中的js脚本

2、把java中的对象注入到html中,在html网页中调用java端的代码,执行javafx中的方法。 代码:

package com.application;

import com.controller.system.IndexController;
import com.jfoenix.controls.JFXDecorator;

import io.datafx.controller.flow.Flow;
import io.datafx.controller.flow.container.DefaultFlowContainer;
import io.datafx.controller.flow.context.FXMLViewFlowContext;
import io.datafx.controller.flow.context.ViewFlowContext;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class IndexApp extends Application {
	@FXMLViewFlowContext
	private ViewFlowContext flowContext;

	@Override
	public void start(Stage stage) throws Exception {
		// TODO Auto-generated method stub
		try {
			Flow flow = new Flow(IndexController.class);
			DefaultFlowContainer container = new DefaultFlowContainer();
			flowContext = new ViewFlowContext();
			flowContext.register("Stage", stage);
			flow.createHandler(flowContext).start(container);

			JFXDecorator decorator = new JFXDecorator(stage, container.getView());
			Scene scene = new Scene(decorator, 600, 600);
			scene.getStylesheets().add(IndexApp.class.getResource("/resources/css/jfoenix-fonts.css").toExternalForm());
			scene.getStylesheets()
					.add(IndexApp.class.getResource("/resources/css/jfoenix-design.css").toExternalForm());
			scene.getStylesheets().add(IndexApp.class.getResource("/resources/css/jfoenix-main-demo.css").toExternalForm());
			stage.setScene(scene);
			stage.setResizable(false);
			stage.show();

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		launch(args);
	}
}

package com.controller.system;

import javax.annotation.PostConstruct;

import io.datafx.controller.FXMLController;
import io.datafx.controller.flow.FlowException;
import io.datafx.controller.flow.context.FXMLViewFlowContext;
import io.datafx.controller.flow.context.ViewFlowContext;
import io.datafx.controller.util.VetoException;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Worker.State;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import netscape.javascript.JSObject;

@FXMLController(value = "/fxml/Index.fxml")
public class IndexController {

	@FXMLViewFlowContext
	private ViewFlowContext context;
	@FXML
	private WebView mWebview;
	@FXML
	private Button btn;

	@PostConstruct
	public void init() throws FlowException, VetoException {
		String myUrl = this.getClass().getResource("/view/javafx_js.html").toExternalForm();

		mWebview.getEngine().load(myUrl);

		WebEngine webEngine = mWebview.getEngine();
		mWebview.getEngine().getLoadWorker().stateProperty().addListener(new ChangeListener<State>() {
			@Override
			public void changed(ObservableValue<? extends State> ov, State oldState, State newState) {
				if (newState == State.SUCCEEDED) {
					JSObject win = (JSObject) webEngine.executeScript("window"); // 获取js对象
					win.setMember("app", new JavaApp()); // 然后把应用程序对象设置成为js对象
					webEngine.executeScript("changeText()");// 直接执行html中的js脚本
				}
			}
		});

	}

	public class JavaApp {
		public void exit() {
			Platform.exit();
		}

		public void login() {
			System.out.println("login...");
		}
	}

}


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSON example</title>
<script language="javascript">
	function changeText() {
		document.getElementById('boldStuff').innerHTML = 'Fred Flinstone';
	}
</script>
</head>
<body>
	<p>
		Welcome to the site <b id='boldStuff'>dude</b>
	</p>
	<input type='button' onclick='changeText()' value='Change Text' />
	<input type='button' onclick='app.exit()' value='退出系统平台' />
	<p>
		<a href="#" onclick="app.exit()">Exit the Application</a>
	</p>
	<p>
		<a href="#" onclick="app.login()">Login</a>
	</p>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.*?>
<?import com.jfoenix.controls.JFXButton?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.HBox?>
<?import com.jfoenix.controls.JFXNodesList?>
<?import javafx.scene.web.WebView?>
<?import javafx.geometry.Insets?>

<AnchorPane fx:id="root" xmlns:fx="http://javafx.com/fxml/1"
	xmlns="http://javafx.com/javafx/2.2">
	<children>
		<StackPane prefHeight="150.0" prefWidth="200.0"
			AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0"
			AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
			<WebView fx:id="mWebview"></WebView>
		</StackPane>
	</children>
</AnchorPane>

© 著作权归作者所有

天高地厚宇宙无穷
粉丝 11
博文 178
码字总数 14180
作品 0
贵阳
私信 提问
JavaFX WebView概述,很强大,内置了类似Electron的功能

来自 Murali Billa JavaFX技术人员的主要成员 在本博客中,我们将了解JavaFX如何呈现网页及其主要的组件 - 即WebView JavaFX是: 用于创建和交付桌面应用程序的软件平台,以及可以在各种设备...

GuoMengyue
2018/09/26
5.2K
2
(翻译)JavaFX高级教程:部署JavaFX2.0应用

原文地址http://download.oracle.com/javafx/2.0/deployment/jfxpub-deployment.htm (译者:由于国内学习JavaFX2.0的童鞋可能极少,加之后面的技术相对高级和复杂,另外本人时间略显不足,后...

davelet
2011/10/30
0
0
javaFX access denied ("java.net.SocketPermission" "localhost:2511" "listen,resolve")

@红薯 你好,想跟你请教个问题: 如果您有时间,请求您尽快回复吧,我明天就得搞定这个问题。 现在是用javaFX另起一个线程(task,new Thread实现),开一个serverSocket监听,获取值。通过页...

leo_soul
2015/08/04
216
0
javafx 的 webview中js调用java重载方法

如题 javafx使用webview控件的时候 需要用js调用java代码 但是java代码中如果有重载方法 (方法名相同 方法参数不通 )就会被覆盖 无法全部调用 js参数是可变长度的 如何在javafx类中 得到完...

衷于栖
2015/01/18
1K
0
JavaFX明天在哪里

从java one 大会上传来的消息,其实更多的是关于javaFx2的消息。oracle没有明确的说要停止javaFX脚本语言的开发,不过似乎表达了这个想法。Oracle should either start pushing JavaFX hard ...

崔钢
2010/10/10
2K
6

没有更多内容

加载失败,请刷新页面

加载更多

代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
58分钟前
4
0
学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
今天
7
0
VMware vSphere的两种RDM磁盘

在VMware vSphere vCenter中创建虚拟机时,可以添加一种叫RDM的磁盘。 RDM - Raw Device Mapping,原始设备映射,那么,RDM磁盘是不是就可以称作为“原始设备映射磁盘”呢?这也是一种可以热...

大别阿郎
今天
10
0
【AngularJS学习笔记】02 小杂烩及学习总结

本文转载于:专业的前端网站☞【AngularJS学习笔记】02 小杂烩及学习总结 表格示例 <div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng-repeat="x in names | orderBy ......

前端老手
昨天
14
0
Linux 内核的五大创新

在科技行业,创新这个词几乎和革命一样到处泛滥,所以很难将那些夸张的东西与真正令人振奋的东西区分开来。Linux内核被称为创新,但它又被称为现代计算中最大的奇迹,一个微观世界中的庞然大...

阮鹏
昨天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部