JavaFX概览

Posted 从零开始的智障生活

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaFX概览相关的知识,希望对你有一定的参考价值。

1. JavaFX概述

JavaFX 是一组图形和媒体包,使开发人员能够设计、创建、测试、调试和部署在不同平台上一致运行的富客户端应用程序。

JavaFX 应用程序

由于 JavaFX 库是作为 Java API 编写的,因此 JavaFX 应用程序代码可以从任何 Java 库中引用 API。例如,JavaFX 应用程序可以使用 Java API 库来访问本机系统功能并连接到基于服务器的中间件应用程序。

可以自定义 JavaFX 应用程序的外观和感觉。级联样式表 (CSS) 将外观和样式与实现分开,以便开发人员可以专注于编码。图形设计人员可以通过 CSS 轻松自定义应用程序的外观和样式。如果您有网页设计背景,或者如果您想将用户界面 (UI) 和后端逻辑分开,那么您可以使用 FXML 脚本语言开发 UI 的表示方面,并为应用程序使用 Java 代码逻辑。如果您更喜欢在不编写代码的情况下设计 UI,那么请使用 JavaFX Scene Builder。在您设计 UI 时,Scene Builder 创建可移植到集成开发环境 (IDE) 的 FXML 标记,以便开发人员可以添加业务逻辑。

可用性

JavaFX API 作为 Java SE 运行时环境 (JRE) 和 Java 开发工具包 (JDK) 的完全集成功能提供。因为 JDK 可用于所有主要桌面平台(Windows、Mac OS X 和 Linux),所以编译到 JDK 7 及更高版本的 JavaFX 应用程序也可以在所有主要桌面平台上运行。JavaFX 8 还提供了对 ARM 平台的支持。适用于 ARM 的 JDK 包括 JavaFX 的基础、图形和控件组件。

跨平台兼容性为 JavaFX 应用程序开发人员和用户提供了一致的运行时体验。

JDK 下载页面上,您可以获得 JavaFX 示例应用程序的 zip 文件。示例应用程序提供了许多代码示例和片段,通过示例展示了如何编写 JavaFX 应用程序。请参阅“如何运行示例应用程序?” 想要查询更多的信息。

主要特点:

JavaFX 8 及更高版本中包含以下功能。在 JavaFX 8 版本中引入的项目相应地指出:

  • Java APIs。JavaFX 是一个 Java 库,由用 Java 代码编写的类和接口组成。这些 API 旨在成为 Java 虚拟机 (Java VM) 语言(例如 JRuby 和 Scala)的友好替代品。

  • FXML 和 Scene Builder(场景生成器)。FXML 是一种基于 XML 的声明性标记语言,用于构建 JavaFX 应用程序用户界面。设计人员可以在 FXML 中编码或使用 JavaFX Scene Builder 以交互方式设计图形用户界面 (GUI)。Scene Builder 生成可移植到 IDE 的 FXML 标记,开发人员可以在其中添加业务逻辑。

  • WebView(网络视图)。一个 Web 组件,它使用 WebKithtml 技术使在 JavaFX 应用程序中嵌入网页成为可能。WebView中运行的javascript可以调用Java API,Java API可以调用WebView中运行的JavaScript。JavaFX 8 中添加了对其他 HTML5 功能的支持,包括 Web Sockets、Web Workers 和 Web Fonts,以及打印功能。请参阅向 JavaFX 应用程序添加 HTML 内容

  • Swing interoperability(Swing 互操作性)。现有的 Swing 应用程序可以使用 JavaFX 功能进行更新,例如丰富的图形媒体播放和嵌入的 Web 内容。SwingNode类,使您可以嵌入Swing的内容进JavaFX应用程序,已在JavaFX 8见添加了SwingNode API的javadocJavaFX的应用程序中嵌入的Swing内容以获取更多信息。

  • Built-in controls(内置 UI 控件) 和 CSS。JavaFX 提供了开发全功能应用程序所需的所有主要 UI 控件。可以使用标准 Web 技术(例如 CSS)为组件设置外观。DatePicker 和 TreeTableView UI 控件现在可用于 JavaFX 8 版本。有关更多信息,请参阅使用 JavaFX UI 控件。此外,CSS Styleable* 类已成为公共 API,允许对象通过 CSS 设置样式。

  • Modena theme(摩德纳主题)Modena 主题取代 Caspian 主题成为 JavaFX 8 应用程序的默认主题。通过setUserAgentStylesheet(STYLESHEET_CASPIAN)在 Application start() 方法中添加该行,Caspian 主题仍然可供您使用。有关更多信息,请参阅fxexperience.com 上的Modena 博客

  • 3D Graphics Features(3D 图形功能)。用于Shape3DBox, Cylinder, MeshView, and Sphere子类)SubScene, Material, PickResult, LightBase (AmbientLightPointLight子类)的新 API 类SceneAntialiasing已添加到 JavaFX 8 的 3D 图形库中。Camera此版本中还更新了 API 类。欲了解更多信息,请参阅入门JavaFX的3D图形文件和相应的API的javadocjavafx.scene.shape.Shape3Djavafx.scene.SubScene, javafx.scene.paint.Material, javafx.scene.input.PickResultjavafx.scene.SceneAntialiasing

  • Canvas API(画布 API)。Canvas API 支持直接在 JavaFX 场景区域内进行绘图,该区域由一个图形元素(节点)组成。

  • Printing API(打印 API)。javafx.print包已添加到 Java SE 8 版本中,并为JavaFX 打印 API提供公共类。

  • Rich Text Support(富文本支持)。JavaFX 8 为 JavaFX 带来了增强的文本支持,包括双向文本和复杂文本脚本,例如控件中的泰语和印度语,以及文本节点中的多行、多样式文本。

  • (Multitouch Support)多点触控支持。JavaFX 根据底层平台的功能提供对多点触控操作的支持。

  • Hi-DPI Support(高 DPI 支持)。JavaFX 8 现在支持 Hi-DPI 显示。

  • Hardware-accelerated graphics pipeline(硬件加速的图形管道)。JavaFX 图形基于图形渲染管道(Prism)。JavaFX 提供流畅的图形,当与支持的图形卡或图形处理单元 (GPU) 一起使用时,可以通过 Prism 快速呈现。如果系统不具有 JavaFX 支持的推荐 GPU 之一,则 Prism 默认使用软件渲染堆栈。

  • Higt-performance media engine(高性能媒体引擎)。媒体管道支持 Web 多媒体内容的播放。它提供了一个基于 GStreamer 多媒体框架的稳定、低延迟的媒体框架。

  • Self-contained application deployment model(自包含的应用程序部署 模型)。自包含的应用程序包具有所有应用程序资源以及 Java 和 JavaFX 运行时的私有副本。它们作为本机可安装包分发,并提供与该操作系统本机应用程序相同的安装和启动体验。

我可以使用 JavaFX 构建什么?

使用 JavaFX,您可以构建多种类型的应用程序。通常,它们是跨多个平台部署的网络感知应用程序,并在具有音频、视频、图形和动画的高性能现代用户界面中显示信息。

初试在eclipse中运行JavaFX示例应用程序

本节中的步骤解释了如何下载和运行可通过 Java 平台 单独下载的示例应用程序。

首先要有一个eclipse和JDK,然后,在工具栏的Help->Install New Software

 点击Add,输入以下内容:

Name:ec(fx)lipse

Location:http://download.eclipse.org/efxclipse/updates-released/2.3.0/site/

 会出现以下两个选项:全部选中,然后一直next到finish。

 等待安装完成,会提示重启,当重启提示跳出,然后重启。(别刚安装就重启)

 每次当你想要使用JavaFX时,会跳出来:

 

您没有用Java8运行您的eclipse实例。因此,JavaFX工具被禁用。使Java8成为默认的系统Java,或者调整您的eclipse.ini以将vm指向您的Java8安装。 如果您想关闭此检查,请打开您的首选项,转到常规>启动和关闭,并取消选中“JavaFX工具Java检查”。

先尝试一下,看非Java 8环境能否使用:

 这里面的Main.java文件没有在JDK库中找到javafx这个包,我的Java是16版的,现在改用Java8。

参考链接:Java 更改 JDK

修改之后,就没有报错了。 

尝试运行,出现以下报错信息:

Exception in thread "main" java.lang.UnsupportedClassVersionError: application/Main has been compiled by a more recent version of the Java Runtime (class file version 60.0), this version of the Java Runtime only recognizes class file versions up to 52.0

线程“main”中出现异常Java . lang . unsupportedclassversionerror:应用程序/Main已由较新版本的Java Runtime编译(类文件版本60.0),此版本的Java Runtime仅识别高达52.0的类文件版本。

这个是由于JAVA字节码,不同版本间的兼容性原因。相关内容参考:https://blog.csdn.net/qq_34028001/article/details/120106355

现在我用了Java8不支持,Java16不可以,那么只能想其他办法了。

初试在CMD中运行JavaFX示例程序

然后就到了JavaFX的官方文档了:https://openjfx.io/index.html

由于JavaFX是由JavaAPI开发实现的,所以必须首先要有一个Java,而且此Java要求是Java8以上版本,尽量是最新版,然后先下载JavaFX的软件开发环境.先到上面的链接中,下载对应平台的JavaFX。

 为了方便,把它解压到我们JDK安装的位置。然后开始设置JavaFX的环境变量。

在Windows命令行中输入如下内容:

set PATH_TO_FX="C:\\Program Files\\Java\\javafx-sdk-15.0.1\\lib"

下载JavaFX示例文件:https://github.com/openjfx/samples

 下载并解压,然后再进入HelloFX下的CLI目录下,里面有一个HelloFX.java。从这里打开命令行,先编译一下试试。因为JavaFX从Java11开始就已经从Java发行版中tichu

在Linux终端中输入如下内容:

javac --module-path $PATH_TO_FX --add-modules javafx.controls HelloFX.java

在Windows中输入如下内容:

javac --module-path %PATH_TO_FX% --add-modules javafx.controls HelloFX.java

然后报了个莫名其妙的错:错误: 无效的标记: Files\\Java\\javafx-sdk-15.0.1\\lib

因为我解压JavaFX的路径中有空格(Program Files),而命令行找到这个变量后,将其直接代入,那么这个空格就被当作隔开指令的内容了,所以需要在上面加上双引号。

D:\\eclipse-workspace\\samples-master\\HelloFX\\CLI\\hellofx>javac --module-path "%PATH_TO_FX%" --add-modules javafx.controls HelloFX.java

然后报了另一个错:错误: 找不到模块: javafx.controls

有是有,那又找不到,我估计javac在识别环境变量的时候,空格会把一个值分成两个,所以原因是路径中有空格。环境变量换个值:

没有了空格再次在Windows下,进入HelloFX.java所在目录,并使用如下代码编译:

javac --module-path %PATH_TO_FX% --add-modules javafx.controls HelloFX.java

 然后运行该代码:

java --module-path %PATH_TO_FX% --add-modules javafx.controls HelloFX

运行结果:

 再次尝试在eclipse中运行JavaFX示例程序

在eclipse中可以创建一个JavaFX 模块 或 非模块项目,并使用IDE工具、Maven或Gradle构建工具。

 非模块化项目

创建一个新的User Library,Eclipse -> Window -> Preferences -> Java -> Build Path -> User Libraries -> New。

以上是关于JavaFX概览的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX窗口拖动

JavaFX自定义窗口标题栏

如何以毫秒为单位获取javaFX音频片段的长度[关闭]

javafx KeyEvent触发两次

JavaFX - 在两者之间暂停调用UI更新方法

初始化后,在javafx中的控制器之间传递变量[duplicate]