热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

整合JavaFX与Swing:实现Java桌面应用的现代化界面设计

通过整合JavaFX与Swing,我们成功地将现有的Swing应用程序组件进行了现代化改造。此次升级不仅提升了用户界面的美观性和交互性,还确保了与原有Swing应用程序的无缝集成,为开发高质量的Java桌面应用提供了坚实的基础。

javafx 和swing

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

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

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

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

  • 这是未来

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

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

    从我所看到的情况来看,我认为这可以保证将提供对Android,IOS等的支持,Oracle已经有了可以在公开会议上展示的工作原型,唯一的问题是何时。 我认为用不了多久,可能很快就会在下一个JavaOne中看到更多有关此的信息。

  • 牢固

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

  • 好漂亮啊

    与Swing不同,不算第三方库本身就很丑陋,而JavaFX从一开始就看起来不错。 鉴于如今的用户期望外观设计良好的应用程序,这是一个很好的观点。

  • 不错的附加功能

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

你怎么做

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

现在,带有JavaFX 2.X的Oracle成为了将JavaFX嵌入Swing的正式方法,这更有意义,但不幸的是,不是将Swing嵌入JavaFX的方法,但是我想这在大多数情况下就足够了。

布置

本质上,当您在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第三方库,则每当在EDT外部访问Swing资源时,也会引发异常。 将Substance设置为Swing的外观可能是减少Swing方面并发错误的好方法。
  3. 在2个UI线程之间共享资源时要非常小心,请尝试尽可能避免这种情况。 解决多线程问题的最佳方法是避免它们,而这些问题是软件工程中最难解决的问题。 Swing最初是从多线程工具包开始而最终更改为单线程工具包,这是有原因的。
  4. 有时您可能想通过Platform.isFxApplicationThread()检查您是否在JavaFX用户线程上,而只发出对Platform.runLater(…)的调用,因为如果您在JavaFX用户线程上并调用runLater(...)内部代码的执行仍将推迟到以后,这可能不是您想要的。

其他要签出的链接:

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

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


翻译自: https://www.javacodegeeks.com/2012/08/integrating-javafx-and-swing.html

javafx 和swing



推荐阅读
  • Android与JUnit集成测试实践
    本文探讨了如何在Android项目中集成JUnit进行单元测试,并详细介绍了修改AndroidManifest.xml文件以支持测试的方法。 ... [详细]
  • importjava.io.*;importjava.util.*;publicclass五子棋游戏{staticintm1;staticintn1;staticfinalintS ... [详细]
  • 深入解析WebP图片格式及其应用
    随着互联网技术的发展,无论是PC端还是移动端,图片数据流量占据了很大比重。尤其在高分辨率屏幕普及的背景下,如何在保证图片质量的同时减少文件大小,成为了亟待解决的问题。本文将详细介绍Google推出的WebP图片格式,探讨其在实际项目中的应用及优化策略。 ... [详细]
  • 本文探讨了在Windows系统中运行Apache服务器时频繁出现崩溃的问题,并提供了多种可能的解决方案和建议。错误日志显示多个子进程因达到最大请求限制而退出。 ... [详细]
  • 在尝试通过自定义端口部署Spring Cloud Eureka时遇到了连接失败的问题。本文详细描述了问题的现象,并提供了有效的解决方案,以帮助遇到类似情况的开发者。 ... [详细]
  • 本文详细探讨了BCTF竞赛中窃密木马题目的解题策略,重点分析了该题目在漏洞挖掘与利用方面的技巧。 ... [详细]
  • 本文介绍了一个使用Spring框架和Quartz调度器实现每周定时调用Web服务获取数据的小项目。通过详细配置Spring XML文件,展示了如何设置定时任务以及解决可能遇到的自动注入问题。 ... [详细]
  • 根据官方定义,RxJava是一种用于异步编程和可观察数据流的API。其核心特性在于流式处理能力和丰富的操作符支持。 ... [详细]
  • Flutter 核心技术与混合开发模式深入解析
    本文深入探讨了 Flutter 的核心技术,特别是其混合开发模式,包括统一管理模式和三端分离模式,以及混合栈原理。通过对比不同模式的优缺点,帮助开发者选择最适合项目的混合开发策略。 ... [详细]
  • 本文详细介绍了如何在Oracle VM VirtualBox中实现主机与虚拟机之间的数据交换,包括安装Guest Additions增强功能,以及如何利用这些功能进行文件传输、屏幕调整等操作。 ... [详细]
  • 本文详细介绍了JQuery Mobile框架中特有的事件和方法,帮助开发者更好地理解和应用这些特性,提升移动Web开发的效率。 ... [详细]
  • 理解浏览器历史记录(2)hashchange、pushState
    阅读目录1.hashchange2.pushState本文也是一篇基础文章。继上文之后,本打算去研究pushState,偶然在一些信息中发现了锚点变 ... [详细]
  • 本文介绍如何使用JavaScript中的for循环来创建一个九九乘法表,适合初学者学习循环结构的应用。 ... [详细]
  • 本文详细介绍了如何在 Vue CLI 3.0 和 2.0 中配置 proxy 来解决开发环境下的跨域问题,包括具体的配置项和使用场景。 ... [详细]
  • 本文介绍了如何在两个Oracle数据库(假设为数据库A和数据库B)之间设置DBLink,以便能够从数据库A中直接访问和操作数据库B中的数据。文章详细描述了创建DBLink前的必要准备步骤以及具体的创建方法。 ... [详细]
author-avatar
手机用户随便转转
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有