概述
JavaFX 是一个基于 Java 的平台,用于构建可以在桌面和移动模拟器上运行的富互联网应用程序(Rich Internet Applications,RIA)。使用 JavaFX 构建的应用程序是基于 Java 字节码的,因此可以运行在任何带有 Java 运行时环境的桌面和任何装有 Java2 ME 的移动设备上。JavaFX 使 GUI 变得十分简单;它使用声明性语法并提供动画支持。
在本文中,学习如何开始使用 JavaFX 来构建 RIA。下载和安装 JavaFX SDK、安装 JavaFX Eclipse 插件、通过创建样例应用程序探索 JavaFX 的基本功能。
本文中使用的 Login Application 和 Animated Circle 示例的源代码。
安装
按照下列步骤下载和安装 JavaFX SDK 和 JavaFX Eclipse 插件。
Windows 的默认安装路径是 C:\Program Files\JavaFX\javafx-sdk-version。
JavaFX Plugin Site、在 Location 中输入 http://javafx.com/downloads/eclipse-plugin/ 作为插件的安装路径。 单击 OK。
单击 Next。
如果您是在非默认路径下安装 JavaFX SDK,需要提示设置 JAVAFX_HOME 变量,如 图 3 所示。您可能也需要创建一个名为 JAVAFX_HOME 的类路径变量,如果 Eclipse 插件安装时没有创建的话,并将其指向 JavaFX 安装路径。
创建一个 Login 应用程序
在本小节,构建一个样例 JavaFX 应用程序来依据用户密码验证用户,如果他们提供了所需的信息,可以允许登录系统。授权成功完成之后,用户将可以看到一个 Welcome 屏幕。如果授权不成功,在 Eclipse Console 视图中将出现一个消息提供失败详情。您可以使用 JavaFX 的 Swing 组件来构建登录界面。您可以 下载 源代码构建 Login 应用程序。
单击 Next。
LoginApp 作为项目名。选择 Desktop 配置文件。这些选项在 图 5 中显示。 单击 Finish。
Main,然后单击 Finish。login 的布尔变量,来维护用户的登录状态(无论最后一次登录是否成功)。声明字符串变量 username 来保存用户输入的用户名。还有一个硬编码的系统用户 test, 它只能登录我们的应用程序。 var login = false;var userName = "";var systemUser = "test"; |
Login App 编辑将要显示的标题,如 图 7 所示。高度和宽度都设置为 300。 单击 Insert,为 Stage 添加一个 Scene 元素。Scene 元素像一个绘画平台或表面,用于显示图形化元素。它有一个 content 变量,保存子元素。
Scene 添加一个 javafx.scene.Group 元素,如 清单 2 所示。该组看起来像您所创建的其余组件的一个容器。 group 元素,如 清单 3所示。content: [ Group { } ] |
SwingLabel 添加一个标签,如 清单 4 所示。 import javafx.ext.swing.SwingLabel; |
content 元素中添加下列代码,如 清单 5 所示。 content : [ SwingLabel { text : "User Name :"; }] |
SwingTextField 类,如 清单 6所示。 import javafx.ext.swing.SwingTextField; |
SwingLabel { text : "User Name :"; },SwingTextField { text : bind userName with inverse; columns : 10; editable : true; layoutX : 30; layoutY : 20; borderless : false; selectOnFocus : true; } |
SwingButton。 import javafx.ext.swing.SwingButton; |
添加 清单 9 所示的代码,来包含位于 Text 字段下方的按钮。
清单 9. 向组中添加 SwingButton
SwingButton{ translateX: 50 translateY: 50 text: "Submit" action: function(){ if((userName != systemUser)) { println("Invalid UserName"); } login = (userName == systemUser); } } |
action 功能检查输入的 userName 是否和系统用户名一致。如果不是,示例打印出错误消息,否则,结果被存储在登录布尔变量中。 到目前为止,您已经解决了登录时出错的状况。您需要使用登录变量就可直接成功登录。这需要一个 if-else 语句。添加 if-else 子句,并在 else 子句中先添加一个空的组,其中带有一个 content 对象。添加高亮显示的代码,如 清单 10 所示。
if-else 子句 content: bind if(not login)Group { content: [ SwingLabel{ text: "User Name:" }, SwingTextField { text : bind userName with inverse; columns : 10; editable : true; layoutX : 30; layoutY : 20; }, SwingButton{ translateX: 50 translateY: 50 text: "Submit" action: function(){ if((userName != systemUser)) { println("Invalid UserName"); } login = (userName == systemUser); } } ] } else Group{ content: [ ] } |
Text 类,如 清单 11 所示。 Text 类import javafx.scene.text.Text; |
else 子句组元素的 content 的正文中。 Text { x: 10 y: 30 content: "You have successfully logged in." },SwingButton{ translateX: 10 translateY: 50 text: "Log out" action: function(){ userName = ""; login = false; } } |
完整代码如 清单 13 所示。
package com.sample.login;import javafx.stage.Stage;import javafx.scene.Scene;import javafx.scene.Group;import javafx.scene.text.Text;import javafx.ext.swing.SwingLabel;import javafx.ext.swing.SwingTextField;import javafx.ext.swing.SwingButton;var login = false;var userName = "";var systemUser = "test";Stage { title : "Login App" scene: Scene { width: 300 height: 300 content: bind if(not login) Group{ content: [ SwingLabel{ text: "User Name:" }, SwingTextField { text : bind userName with inverse; columns : 10; editable : true; layoutX : 30; layoutY : 20; }, SwingButton{ translateX: 50 translateY: 50 text: "Submit" action: function(){ if((userName != systemUser)) { println("Invalid UserName"); } login = (userName == systemUser); } } ] } else Group{ content: [ Text { x: 10 y: 30 content: "You have successfully logged in." }, SwingButton{ translateX: 10 translateY: 50 text: "Log out" action: function(){ userName = ""; login = false; } } ] } } } |
运行应用程序
在这一小节中,您将测试示例 Login 应用程序。保存到目前为止所做的修改。
abc 然后单击 Submit。登录失败,因此您可以看到在控制台上记录的错误信息。test 然后单击 Submit。系统接受这个用户名,登录成功,如 图 9 所示。 创建一个应用程序在一个移动模拟器上运行
上面创建的 LoginApp 使用 Desktop 配置文件。本小节中创建一个应用程序,使用一个 Mobile 配置文件并在移动模拟器上运行。本例探索如何创建动画图形。您还将呈现一个圆形区域,其不透明度在不同时间段不断变化。
AnimatedCircle,如 图 10 所示。选择 Mobile 配置文件。 单击 Finish。
Main 作为 Name,单击 Finish。Animated Circle 作为 Title。其余保持原来的默认设置,然后单击 Insert。content 元素内的源编辑器中。在 Insert Template 对话框中输入 Color.BLUE 作为 fill 属性,如 图 11 所示。 单击 Insert.
添加动画支持
向圆形区域中添加动画支持,该示例在不同时间间隔简要介绍如何修改圆形区域的不透明度。您需要一个包含 KeyFrames 的 TimeLine。这个示例有两个关键帧:一个修改圆形区域的不透明度,每 5 秒钟从 0.0 改为 0.5,另一个每 10 秒从 0.5 改为 1.0。
opacity 的变量。var opacity = 1.0; |
Circle { opacity : bind opacity; centerX: 100, centerY: 100, radius: 40, |
TimeLine 元素。在 Snippets 窗口中,选择 Animations 选项卡将其展开。将 TimeLine 元素拖拽到编辑器上。从 Insert Template 对话框输入 5s 作为时间值,如 图 14 所示。 单击 Insert。
图 15 展示了将 TimeLine 拖拽到编辑器之后生成的代码。
Values 元素拖拽到 canSkip 属性之后。在 Insert Template 对话框中,输入 opacity 作为变量值,如 图 16 所示。 单击 Insert。在 图 17 所示的已生成代码中,将不透明度值修改为 0.5。
KeyFrame,有一个 10 秒的时间变量和一个不透明度修改为 1.0 的 Values 元素。代码看起来如 图 18 所示。 .play(),如 图 19 所示。 结束语
在本文中,您了解了 JavaFX 及如何使用它来快速构建 GUI 应用程序。本文示例展示了如何使用 Swing 组件构建表单,还研究了如何开发图形化应用程序以及向其中添加动画支持。