集成JavaFX和Swing(修订版)

我刚刚完成了对使用Swing的应用程序组件的重写,现在正在使用JavaFX,最后得到了与更大的swing应用程序集成的JavaFX组件。 这是一个很大的应用程序,重写花了我一段时间,最后一切都很好,我很高兴自己做到了。

您可能想在秋千应用中执行此操作的原因

您可能想要重写Swing应用程序并将其更改为使用JavaFX,最简单的方法是通过一次更改每个组件来增量执行此操作。 这就要求您将每个新更改的JavaFX组件与其余的Swing应用程序集成在一起。

我将总结为什么您可能要开始将应用程序从Swing重写为JavaFX:

  • 这是未来

从某种意义上说,Swing已经死了,因为它不会得到任何进一步的发展。 JavaFX是Java的新UI工具包,它为将来提供了更好的准备,例如触摸支持,3D,内置动画支持,视频和音频播放等。

  • 未来可能对移动设备的支持:Android,IOS…

已经有一个可以使用的原型,使您可以将javafx应用程序移植到名为RoboVM的IOS – http://www.robovm.org/ 。 随着越来越多的JavaFX开源,更好的RoboVM将变得更好,随着这种开源的发展,可能会出现其他实用程序,这些实用程序将允许移植到其他环境。

  • 牢固

JavaFX是一个经过精心设计的工具包,具有快速增长的步伐,光明的未来和一系列良好的免费UI工具。 此外,与过去不同,Oracle给予开发人员反馈很大的重要性,即更改和调整其API以实现其目标。

  • 好漂亮啊

与Swing不同,不算第三方库本身就很丑陋,JavaFX从一开始就看起来不错,尤其是JavaFX 8的新Modena外观: http : //fxexperience.com/2013/03/modena-theme-update / -。 鉴于当今用户期望外观好,设计良好的应用程序,这是一个很好的观点。

  • 不错的附加功能

一些不错的功能,例如图表API,支持HTML5的嵌入式浏览器等。

你怎么做

回到JavaFX 1.3,您可以将Swing嵌入JavaFX,但不能反之,至少不是正式的。 我实现了一个Swing组件,该组件允许您将JavaFX内容嵌入到Swing中(称为JXScene),并使其在jfxtras项目中公开可用。 这是将JavaFX场景嵌入Swing应用程序的唯一方法。

现在,带有JavaFX 2.X的Oracle成为在Swing中嵌入JavaFX的正式方法,这更有意义,但不幸的是,这不是在JavaFX中嵌入Swing的方法,我想这在大多数情况下就足够了。 但是,随着即将到来的JavaFX 8,您还可以通过Swing节点在JavaFX应用程序中嵌入一个swing组件。

建筑学

本质上,当您在Swing中嵌入JavaFX时,最终会有2个正在运行的UI线程:Swing EDT线程和JavaFX User线程。

将来有可能像SWT那样只有两个线程,使得Swing在JavaFX User Thread上运行,但是现在我们必须使用2个线程来管理方式。

在UI中同时运行的两个线程使问题变得复杂,并且使JavaFX集成不像您期望的那样容易,除非您正在做一些琐碎的小型应用程序,但我想这不是大多数现实世界中的场景。用例。 如果您正在做一个小型应用程序,那么最好在JavaFX中完成所有操作。

编码

JavaFX提供了JFXPanel,它是一个承载JavaFX场景的Swing面板。 您可以在JFXPanel上设置场景,然后在可以添加Swing组件的位置添加面板。

要访问JavaFX数据,您必须将代码包装在Runnable对象中,并调用Platform.runLater方法:

jbutton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Platform.runLater(new Runnable() { @Overridepublic void run() {fxlabel.setText("Swing button clicked!"); }});}
});

另一方面是Swing数据。 该数据只能由EDT访问。 为确保您的代码在EDT上运行,请将其包装到Runnable对象中,然后调用SwingUtilities.invokeLater :

SwingUtilities.invokeLater(new Runnable() {@Overridepublic void run() {//Code to change Swing data.}
});

提示

  1. 当您在JavaFX用户线程之外访问JavaFX资源时,JavaFX已经引发了异常,但是请记住,这并不总是发生。 为了最大程度地降低性能成本,并未检查所有情况。
  2. 如果您使用Substance (我认为毫无疑问,Swing具有最佳外观的自由外观),那么只要在EDT外部访问Swing资源,也会抛出异常。 将物质设置为您的Swing外观可能是一个很好的解决方案,可以减少您可能在Swing方面发生的并发错误。
  3. 在2个UI线程之间共享资源时要非常小心,请尝试尽可能避免这种情况。 解决多线程问题的最佳方法是避免它们,而这些问题是软件工程中最难解决的问题。 Swing起初是作为多线程工具包并最终更改为单线程工具包,这是有原因的。
  4. 有时您可能想通过Platform.isFxApplicationThread()检查您是否在JavaFX用户线程上,而只发出对Platform.runLater(…)的调用,因为如果您在JavaFX用户线程上并调用runLater(...)内部代码的执行仍将推迟到以后,这可能不是您想要的。
  5. 有很多JavaFX控件可以覆盖它们的摆动控件,但是它们是不同的,并且具有必须适应的不同功能。 还有一些控件,例如JFormattedTextField尚不存在。 总之,JavaFX与Swing不同。 您必须适应不同的控件以及不同的Arquitecture和API。

其他链接签出:

  • Oracle教程: http : //docs.oracle.com/javafx/2/swing/jfxpub-swing.htm

参考: Pixel Duke博客上来自JCG合作伙伴 Pedro Duque Vieira的JavaFX和Swing集成(修订) 。

翻译自: https://www.javacodegeeks.com/2013/07/integrating-javafx-and-swing-revised.html

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

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

相关文章

C++内存模型

C内存模型 一文了解所有C内存的问题 AlexCool 目录 一 C内存模型 二 C对象内存模型 三 C程序运行内存空间模型 四 C栈内存空间模型 五 C堆内存空间模型 六 C内存问题及常用的解决方法 七 C程序内存性能测试 环境: uname -a Linux alexfeng 3.19.0-15-generic #…

java bag_Java - T---bag - 博客园

Java是一门面向对象编程语言,不仅吸收了C语言的各种优点,还摒弃了C里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,…

IT服务(运维)管理实施的几个要点--序言

IT服务(运维)管理(不是IT运维技术)是IT行业当中相对比较“窄”的一个分支,通常只被金融、电信等大型数据中心的中高层管理人员所关注。但是根据笔者多年从事IT服务和服务管理的经验来看,IT服务并不是一件容…

HTML条件注释

前面的话 IE条件注释是微软从IE5开始就提供的一种非标准逻辑语句,作用是可以灵活的为不同IE版本浏览器导入不同html元素。很显然这种方法的最大好处就在于属于微软官方给出的兼容解决办法而且还能通过W3C的效验 识别IE 因为从IE10开始,IE浏览器已经不再支…

MongoDB主键是您的朋友

MongoDB集合中的所有文档都有一个主键,称为_id 。 该字段在插入后自动分配给文档,因此几乎不需要提供它。 _id字段的有趣之处在于它是基于时间的 。 也就是说,基础类型的_id ,这是ObjectId ,是一个12字节的BSON型 &…

java getqueue 0_Java Queue的使用

Queue 实现一个先进先出的队列获取队列长度:size()添加元素到队尾:boolean add(E e) /boolean offer(E e)获取队列头部元素并删除:E remove() / E poll()获取队列头部元素但不删除:E element() / E peek()当添加或获取元素失败时t…

1015. Reversible Primes (20)

生词以及在文中意思prime 素数1.java十进制转为N进制:Integer.toString(int i,int radix)//返回的是i的二进制表示,返回类型为String,但是负数不适用。 N进制转为十进制:Integer.parseInt(String s,int radix)//radix进制的s&…

PAT 乙级 1029 旧键盘

1029 旧键盘 分数 20 作者 CHEN, Yue 单位 浙江大学 旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。 输入格式: 输入在 2 行中…

css之absolute

一、absolute和float有相同的特性&#xff0c;包裹性和破坏性 1、absolute和float的相似(看下面的demo&#xff0c;如果图片在左上角&#xff0c;那么用float和absolute都一样) 1 <!doctype html>2 <html>3 <head>4 <meta charset"utf-8">5…

Spring Data Solr教程:分页

在我的Spring Data Solr教程的较早部分中&#xff0c;我们实现了一个简单的搜索功能&#xff0c;该功能用于搜索待办事项的信息。 我们搜索功能的当前实现将所有搜索结果显示在一个页面中。 对于大多数现实生活中的应用程序而言&#xff0c;这不是可行的解决方案&#xff0c;因…

消息队列01

公司项目里面用到了这个rabbitmq&#xff0c;自己以前不熟悉&#xff0c;看了代码里面的应用&#xff0c;自己也准备试着搭建下。 可以参照其他博主的这篇优秀博文&#xff1a; https://www.cnblogs.com/chengpeng15/p/5814197.html 一 前期需要了解的概念 1.什么是异步&#x…

java instanceof翻译_Java 中的instanceof简单讲解

Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出&#xff0c;这个对象是否是这个特定类或者是它的子类的一个实例。用法&#xff1a;result object instanceof class参数&#xff1a;Result&#xff1a;布尔类型…

Spring4有条件

Spring 4引入了一个称为Conditional的新功能&#xff0c;该功能针对于生成bean的Spring组件&#xff0c;并注视这些bean的生成&#xff0c;实质上&#xff0c;它提供了一种条件生成bean的方法。 考虑一个简单的例子&#xff1a; 我有一个名为“ CustomerService”的服务&…

inline「一」:从 image 底部白边初识 line-height

本文首发于个人博客 http://www.lijundong.com/image-and-line-height/ 今天在做一个静态页面时&#xff0c;图片底部出现一条 3px 高度的白边&#xff0c;既不是 margin 也不是 padding&#xff0c;找了好久没能解决&#xff0c;后来才发现与 line-height 相关&#xff0c;问…

(转) STM32--ADC

原标题&#xff1a;STM32之ADC步骤小技巧&#xff08;英文&#xff09; 看到标题&#xff0c;别吓到哈、并不是要用英文写、至于原因是什么、请往下看&#xff1a; 言归正传&#xff1a;STM32的ADC模块的特色 1、1MHz转换速率、12位转换结果&#xff08;12位、记住这个12位哈、…

java resultset 映射到实例_[Java]ResultSet的用法与实例

JDBC API 2.0/3.0中ResultSet记录集的简便实用的新特性1 新定义了若干个常数这些常数用于指定ResultSet 的类型游标移动的方向等性质&#xff0c;如下所示&#xff1a;public static final int FETCH_FORWARD; 该常数的作用是指定处理记录集中行的顺序&#xff0c;是由前到后即…

嗨,那里有回调!

因为是我的书包&#xff0c;所以我喜欢JavaScript 。 实际上&#xff0c;我已经开始喜欢JavaScritp的面向异步回调的编程风格 。 因此&#xff0c;当我发现自己处于非JavaScript环境中时&#xff08;例如Java&#xff09; &#xff0c;我往往会错过使用回调的机会。 好消息是…

python2.x 文件读写

打开文件 f open(filename,type) # filename 是文件所在路径# type 为文件打开的方式&#xff0c;也是字符串 读取单行 oneLineStr f.readline() 读取所有&#xff0c;一行一行读取 allInLines f.readlines() 读取所有&#xff0c;返回一个字符串 all f.read() 去除字符串开…

synchronized 修饰在 static方法和非static方法的区别

Java中synchronized用在静态方法和非静态方法上面的区别 在Java中&#xff0c;synchronized是用来表示同步的&#xff0c;我们可以synchronized来修饰一个方法。也可以synchronized来修饰方法里面的一个语句块。那么&#xff0c;在static方法和非static方法前面加synchronized到…

Flexible 弹性盒子模型之CSS justify-content 属性

实例 在弹性盒对象的 <div> 元素中的各项周围留有空白&#xff1a; div{display: flex;justify-content: space-around;} 复制 效果预览 浏览器支持 表格中的数字表示支持该属性的第一个浏览器的版本号。 紧跟在 -webkit-, -ms- 或 -moz- 后的数字为支持该前缀属性的第一…