在Swing和Swt中使用JavaFX

转载自  在Swing和Swt中使用JavaFX

本人从08年12月份,JavaFX发布第一个版本开始关注它的发展。

 算算到现在,也差不多是第五个年头了。期间经历了一些动荡,但JavaFX还是坚持着发展了下来,也经历了很多改变(这也是Java技术的特点,不会像微软对技术的抛弃和更新换代很频繁),由以前顺应富互联网技术发展的单纯的JavaFX脚本语言,到现在已经变为完全用于取代Swing的技术。

  

 虽然是为了取代Swing,但任何的技术为了不造成很大的影响,都必须有一个逐步换代的过程。如果单纯的从JDK中剔除Swing而增加JavaFX的话,将会造成世界数不清的程序无法运行,影响不可估量(就像JDK中有很多以前不合理的旧的类库,就算有新的可替代的方案,也不能将以前的完全删除,所以JDK其实越来越臃肿)。这里,我们将会介绍一下如何在Swing中使用JavaFX。

  首先我们要明白,不管是Swing还是JavaFX,GUI的构建必须要各自的EDT(事件分发线程)中进行,这也是在其他线程中操作UI会出现error的原因。

  而在JavaFX中,新增加了JFXPanel。这个组件是JavaFX和Swing进行混合编程的桥梁。

  下面我们来看看JFXPanel的继承关系。

  

  大家可以看到,JFXPanel是继承于JComponent的。而JavaFX的UI控件都是继承于javafx.scene.control.Control。所以很明显,它其实是一个Swing组件,而非JavaFX的组件。

  下面我们来看看JPanel的继承关系。

  

  继承关系基本相同,也就是说,凡是在使用JPanel的地方,我们都可以用JFXPanel来替代。JFXPanel中有一个setScene方法,可以设置其中显示的JavaFX内容。

  根据文档介绍,setScene方法可以在Swing和JavaFX的EDT中使用。也可以说,setScene才是将JavaFX和Swing结合起来的关键。

  不过由于JavaFX的GUI的构建也需要在JavaFX的事件分发线程中进行。所以我们还需要用到另外一个类Platform。

  Platform.runLater(new Runnable())中间执行的是JavaFX的事件分发线程。我们可以在Runnable中进行JavaFX的UI的创建。

  下面我们来看一个简单的示例-----在Swing中嵌入一个JavaFX的网页浏览器。

  

import java.awt.BorderLayout;
import java.awt.Toolkit;import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;import javax.swing.JFrame;public class MainClass {private static final int WIDTH = 800;private static final int HEIGHT = 600;private static final String url = "http://blog.csdn.net/ml3947";private static final String urlStart = "http://";/*** @param args*/public static void main(String[] args) {JFrame frame = new JFrame("JavaFX in Swing");final JFXPanel webBrowser = new JFXPanel();frame.setLayout(new BorderLayout());frame.add(webBrowser, BorderLayout.CENTER);Platform.runLater(new Runnable() {@Overridepublic void run() {Group root = new Group();Scene scene = new Scene(root, WIDTH, HEIGHT);webBrowser.setScene(scene);Double widthDouble = new Integer(WIDTH).doubleValue();Double heightDouble = new Integer(HEIGHT).doubleValue();VBox box = new VBox(10);HBox urlBox = new HBox(10);final TextField urlTextField = new TextField();urlTextField.setText(url);Button go = new Button("go");urlTextField.setPrefWidth(WIDTH - 70);urlBox.getChildren().addAll(urlTextField, go);WebView view = new WebView();view.setMinSize(widthDouble, heightDouble);view.setPrefSize(widthDouble, heightDouble);final WebEngine eng = view.getEngine();eng.load(url);root.getChildren().add(view);box.getChildren().add(urlBox);box.getChildren().add(view);root.getChildren().add(box);go.setOnAction(new EventHandler<ActionEvent>() {@Overridepublic void handle(ActionEvent event) {if (!urlTextField.getText().startsWith(urlStart)) {eng.load(urlStart + urlTextField.getText());} else {eng.load(urlTextField.getText());}}});}});int screenWidth = Toolkit.getDefaultToolkit().getScreenSize().width;int screenHeight = Toolkit.getDefaultToolkit().getScreenSize().height;frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(WIDTH, HEIGHT);frame.setLocation((screenWidth - WIDTH) / 2, (screenHeight - HEIGHT) / 2);frame.setVisible(true);}}

  这是一个很简单的例子。

  我们创建了JFrame和JFXPanel,然后在Platform.runLater中进行Scene的创建,并设置到JFXPanel中。

  我们创建了一个Textfield用来输入网址,创建了一个JavaFX Button来跳转到网址。判断网址是不是http://开头并做简单的处理。

  下面看看运行效果:

  

  如图所示。

   另外,在Swt中使用的话是JFXCanvas,由于实现机制的问题,我们并不需要像在Swing中使用Platform类。而JFXCanvas也是org.eclipse.swt.widgets.Canvas的直接子类,我们可以直接使用。

  示例如下:

public class JFXInSwt {private static Scene createScene() {Group group = new Group();Scene scene = new Scene(group);Button button = new Button("JFX Button");group.getChildren().add(button);return scene;}public static void main(String[] args) {Display display = new Display();Shell shell = new Shell(display);shell.setLayout(new FillLayout());FXCanvas canvas = new FXCanvas(shell, SWT.NONE);Scene scene = createScene();canvas.setScene(scene);shell.open();while (!shell.isDisposed()) {if (!display.readAndDispatch()) display.sleep();}display.dispose();}}
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三大特性之封装性

体现一 Java中通过将属性声明为私有的(private)&#xff0c;再提供公共的&#xff08;public&#xff09;方法:getXxx()和setXxx()实现对该属性的操作&#xff0c;以实现下述目的&#xff1a; 隐藏一个类中不需要对外提供的实现细节&#xff1b; 使用者只能通过事先定制…

JQuery 表单校验

表单校验的作用 为什么要进行表单验证&#xff1a;保证数据符合要求 为什么要进行JavaScript或者jQuery表单验证&#xff1a; 1.降低服务器端负担 2.还可以进行服务器验证&#xff08;JSP&#xff09; 正则表达式 为什么使用正则表达式&#xff1a; 简洁的代码 严谨的验证文…

ssl2348-连接格点【图论,最小生成树,并查集】

题目 有一个M行N列的点阵&#xff0c;相邻两点可以相连。一条纵向的连线花费一个单位&#xff0c;一条横向的连线花费两个单位。某些点之间已经有连线了&#xff0c;试问至少还需要花费多少个单位才能使所有的点全部连通。 输入 第一行输入两个正整数m和n。 以下若干行每行…

活动: 北京Xamarin分享会第4期(2017年7月8日)

BXUG(Beijing Xamarin User Group)将举行第4期线下活动&#xff0c;本期内容预告&#xff1a; 案例演讲: "Xamarin原生跨平台开发的风险与收益"分享者: 神秘分享嘉宾Mike&#xff0c;来自国内一线互联网教育公司的研发经理&#xff0c;.NET新时代CTO联盟发起者。方案…

内存模型是怎么解决缓存一致性的

转载自 内存模型是怎么解决缓存一致性的 在再有人问你Java内存模型是什么&#xff0c;就把这篇文章发给他这篇文章中&#xff0c;我们介绍过关于Java内存模型的来龙去脉。 我们在文章中提到过&#xff0c;由于CPU和主存的处理速度上存在一定差别&#xff0c;为了匹配这种差距…

这是什么操作?java中的变量竟然可以先使用后声明?

相信大家在看到标题之后&#xff0c;是疑惑的点进来看内容的。 在看到标题之后&#xff0c;大家肯定会怀疑&#xff0c;我赵某人用java写了好几年的代码了&#xff0c;还真就没见过java中的变量能先用在声明&#xff0c;今天就是进来看看你在没有声明变量的前提下是怎么用的&a…

重写(override / overwrite)

方法的重写(override / overwrite) 1.重写&#xff1a;子类继承父类以后&#xff0c;可以对父类中同名同参数的方法&#xff0c;进行覆盖操作 2.应用&#xff1a;重写以后&#xff0c;当创建子类对象以后&#xff0c;通过子类对象调用子父类中的同名同参数的方法时&#xff0c;…

ssl1613-最短路径问题【图论,最短路径(还不明显?)】

题目 一个图&#xff0c;求两个点的最短路径 输入 第一行为一个整数n。 n行&#xff0c;两个整数x和y&#xff0c;一个点的坐标 一个整数m&#xff0c;表示图中线的个数。 m行&#xff0c;一条线&#xff0c;i,j&#xff0c;表示第i个点和第j个点之间有线。 最后一行&am…

jQuery 表格实现

<script type"text/javascript">$(function(){/******实现全选的操作****/$("#chks").click(function(){//获得当前框的勾选状态var flag $("#chks").prop("checked");$("input[namechk]").prop(checked,flag);})/*…

来吧学学.Net Core之项目文件简介及配置文件与IOC的使用

序言 在当前编程语言蓬勃发展与竞争的时期,对于我们.net从业者来说,.Net Core是风头正紧,势不可挡的.芸芸口水之中,不学习使用Core,你的圈内处境或许会渐渐的被边缘化.所以我们还是抽出一点点时间学学.net core吧. 那VS Code 可以编写,也可以调试Core本人也尝试啦下,但是感觉…

真正的问题应该在我身上……

渐渐地&#xff0c;学生已进入学习状态。在未测试之前&#xff0c;一直以为大家都学的很好&#xff0c;从课堂上的互动氛围就可以看得出来&#xff0c;一问问题&#xff0c;你一言他一语的……在测试之后&#xff0c;真是让我大跌眼镜&#xff0c;平时感觉表现很好的学生们&…

搞定计算机网络面试,看这篇就够了

转载自 搞定计算机网络面试&#xff0c;看这篇就够了 文章目录结构&#xff1a; 一 OSI与TCP/IP各层的结构与功能&#xff0c;都有哪些协议 运输层主要使用以下两种协议&#xff1a; UDP的主要特点&#xff1a; TCP的主要特点&#xff1a; 域名系统&#xff08;Domain Nam…

来吧学学.Net Core之登录认证与跨域资源使用

序言 学习core登录认证与跨域资源共享是越不过的砍,所以我在学习中同样也遇到啦这两个问题,今天我们就用示例来演示下使用下这2个技术点吧. 本篇主要内容如下: 1、展示一个登录认证的简单示例 2、跨域资源访问 3、跨域获取登录认证的用户信息 .Net Core使用身份认证(Auth…

ssl1760-商店选址问题【图论,最短路】

题目 给出一个城市的地图&#xff08;用邻接矩阵表示&#xff09;&#xff0c;商店设在一点&#xff0c;使各个地方到商店距离之和最短。 输入 第一行为n&#xff08;共有几个城市&#xff09;&#xff1b; N小于201 之后邻接矩阵 3 0 3 1 3 0 2 1 2 0 输出 最短路径…

JSP 获得服务器时间和浏览器时间

发布项目到服务器并访问 创建Web项目&#xff0c;开发静态页面 部署到服务器Tomcat 启动服务器Tomcat 不同用户通过浏览器来访问Web项目 Web项目和Java项目的区别 Web项目需要JavaEE的类库 Web项目中还可以存放静态网页和动态网页 开发目录和部署目录的区别 开发目录&…

如果要你选择某读书APP的图标,你会选择哪一个?

声明&#xff1a;介于尊重每位同学的劳动成果&#xff0c;故本文所有广告收入、赞赏均会均分给同学们&#xff01;最近学到了平面设计基础&#xff0c;于是让同学们用所学知识以“读书”为主题&#xff0c;原创了各式各样的图标&#xff0c;也许屏幕前的你只是轻轻的一划而过&a…

从理论知识到落地能力,你欠缺了什么?

转载自 从理论知识到落地能力&#xff0c;你欠缺了什么&#xff1f; 本文是一个理论过度到实践的典型案例&#xff0c;借助程序员经常遇到的一个问题——网络为什么不通&#xff0c;来具体说明怎么将书本上的死知识真正变成我们解决问题的能力。 大学学到的基本概念 我相信…

三大特性之多态性

1.理解多态性&#xff1a;可以理解为一个事物的多种形态。 2.何为多态性&#xff1a; 对象的多态性&#xff1a;父类的引用指向子类的对象&#xff08;或子类的对象赋给父类的引用&#xff09; 3.多态的使用&#xff1a;虚拟方法调用 有了对象的多态性以后&#xff0c;我们在编…

在这里,我们为您绘制了专属海报,请您查收!

树叶在空中飘荡&#xff0c;谱写着一曲感恩的乐章&#xff0c;那是大树对滋养它的大地的感恩;白云在蔚蓝的天空中飘荡&#xff0c;绘画着那一幅幅感人的画面&#xff0c;那是白云对哺育它的蓝天的感恩。我们沐浴着爱的阳光长大&#xff0c;我们滋润着人间的真情成长&#xff0c…

ssl1761-城市问题【图论,最短路,Dijkstra】

题目 一个图&#xff0c;输出从k点到每个点的最短路 输入 第一行有两个整数n和k&#xff0c;中间用空格隔开&#xff1b;以下是一个NxN的矩阵&#xff0c;表示点间的距离。 3 1 0 3 1 3 0 2 1 2 0 输出 输出点k到各点的距离 3 0 2 解题思路 用Dijkstra算法&#xff…