Skip to content

Latest commit

 

History

History
512 lines (330 loc) · 28.6 KB

File metadata and controls

512 lines (330 loc) · 28.6 KB

三、开发 JavaFX 桌面和 Web 应用

本章将介绍如何开发引人注目的桌面和 web 应用,这些应用利用多核、硬件加速的 GPU 来提供具有惊人外观和感觉的基于 UI 的高性能应用。

由于 JavaFX 完全是用 Java 从头开始编写的,一些 JavaSE8 内置的核心库将用于为我们的应用提供动力。此外,我们将学习如何将我们的应用打包为一个独立的应用来启动和分发。

此外,我们还将介绍 JavaFX8 所使用的任何 web 应用中的基本核心 web API,如javafx.scene.web.WebEnginejava.net.HttpURLConnectionjavafx.scene.web.WebView

我们将讨论 JavaFX 和 HTML5 之间的关系,这一点很重要,因为 JavaFX 的 API 和 HTML5 的特性是相辅相成的。HTML5 是一个富 web 内容的平台,用于创建类似于RIA富互联网应用)的具有本机桌面软件特征的 web 应用的用户体验。

更重要的是,我们将开发一个桌面版的笔记应用,然后在网络上运行它。

此外,我们将涵盖将笔记作为 web 应用部署到桌面和 web 上所需的所有知识和技能。

以下是本章将学习的技能:

  • 开发和运行桌面和 web 应用
  • 控制应用界面
  • 如何打包 JavaFX8 桌面应用
  • 在 JavaFX 应用中加载 HTML5 内容
  • 将数据从 JavaFX 发送到 JavaScript,反之亦然
  • 部署 JavaFXWeb 应用

开发笔记应用

为一个平台构建应用已经不够好了。桌面、Web、移动和嵌入式支持都是成功的产品所必需的,但是学习不同的环境是很困难的。正如我们将在本章中看到的那样,这里发挥了 JavaFX 编写应用的能力,该应用将通过简单的调整在不同的平台上运行。

在这里,我们将为桌面和 Web 构建一个笔记应用。在本项目中,我将向您展示如何使用 JavaFX8 SDK 和 Java 编程语言,使用我们之前安装的开发工具从头开始创建一个完整的 JavaFX 应用(请参阅第 1 章JavaFX 8 入门

然后,我将向您展示如何创建应用的两个屏幕布局,以及如何创建控制它们的 Java 类。我将创建按钮来控制不同场景之间的导航,保存数据,然后使用属性绑定功能动态更新 UI 控件。

最终项目将如以下屏幕截图所示:

Developing a note-taking application

记笔记应用

此图显示从主屏幕“新建注释”按钮打开的“添加和编辑”屏幕,用于添加新注释,或从“编辑”按钮打开以编辑所列注释之一,如下所示:

Developing a note-taking application

那么,你还在等什么?走吧!

构建 UI 原型

使用复杂用户界面(即使是简单的用户界面)构建任何成功应用的第一步是原型化您的布局、屏幕关系、它们的状态和导航。在一张纸上画出草图,然后从您的团队和经理那里获得反馈。重新制作,一旦批准,就开始为客户构建一个真正的交互式原型,以便获得他们对最终产品的反馈。

这就是我们现在要做的,我们的应用已经在任何易于使用的 UI sketcher 工具上的一张纸上展示出来,如下图所示。然后,我们将使用场景生成器工具将其开发为一个完整的原型。

此外,我们将看到 NetBeans 和场景生成器工具之间的互操作性。

请注意,首先在纸上绘制布局更容易绘制布局,因为这是一种在与开发工具交互之前编辑、增强和计算最终应用布局的非常快速的方法。

现在,随着我们已经绘制了应用的草图,我们已经准备好构建应用的真实原型。

充分利用这些工具的最佳方法是在 NetBeans IDE 中创建应用框架(控制器类和 FXML 基页定义,然后在 Scene builder 工具中创建和开发 FXML 页。这是两个工具之间强大的互操作性。

Building the UI prototype

以下是使用 JavaFX FXML 应用启动的步骤:

  1. Open up the NetBeans IDE, and from the main menu, choose File, and then New Project a New Project dialog will open. From Categories, choose JavaFX, and then under Projects, choose JavaFX FXML Application. Then, click on the Next button:

    Building the UI prototype

    一个新的 JavaFX-FXML 应用

  2. In the JavaFX FXML application dialog, add the relevant information. From Project name, add the location and FXML name (in my case, ListNotesUI). In Create Application class, I have added packt.taman.jfx8.ch3.NoteTakingApp, as shown in the following figure. Hit Finish.

    Building the UI prototype

  3. 现在我们有了一个包含第一个 FXMLUI 文档(ListNotesUI.fxml)的项目,我们需要在其控制器旁边添加第二个 FXMLUI 文档(AddEditUI.fxml

  4. 要从文件中执行操作,请选择新文件;然后在类别列表下选择JavaFX,在文件类型列表中选择空 FXML,最后点击下一步,如下图所示。

  5. In the New Empty FXML and Location dialog, edit the FXML Name field to be AddEditUI, and then click on Next.

    Building the UI prototype

    添加新的空 FXML 文档

  6. In the Controller Class dialog as in the following screen, tick the Use Java Controller checkbox. Make sure that Create New Controller has been selected, with the Controller Name as AddEditUIController. Then, click on Next, skip the Cascading Style Sheet dialog, and finally, click on Finish:

    Building the UI prototype

    向 FXML 文档中添加新控制器

我们已经构建了我们的项目结构,是时候使用场景生成器将我们的控件添加到页面 UI 中了,类似于我们在纸上绘制的。要做到这一点很容易:

  1. From NetBeans, right-click on ListNotesUI.fxml and select Open or just double-click on it. Scene Builder will open with your FXML document in design mode.

    注意:仅当您的计算机上安装了场景生成器时,它才起作用。

  2. Design the page as per the following screenshot. Most importantly, don't forget to save your changes before returning back to NetBeans or closing Scene Builder for logic implementation.

    Building the UI prototype

    完整的 ListNotesUI.fxml 文档设计

  3. Perform the same steps for AddEditUI.fxml, and your design should end up like this:

    Building the UI prototype

    完整的 AddEditUI.fxml 文档设计

除了使用它们的属性控制间距、对齐方式、字体和颜色外,您还需要查看 FXML 文档,以了解我们如何嵌套许多容器和 UI 控件,以实现前面绘制的所需 UI。

祝贺您已将草图布局转换为生动的内容,可以作为一个项目呈现给您的团队领导和经理,而无需逻辑,以获取他们对颜色、主题和最终布局的反馈。此外,一旦获得批准,您就可以在深入了解业务逻辑之前继续进行最终客户反馈。

让您的应用充满活力–添加交互

在设计应用之后,您需要通过使其更具交互性和响应性,从而使其更具生命力,并根据客户提出的功能需求执行和行动。

我经常做的第一件事是在每页之间添加导航处理程序,我在每个 FXML 文档控制器类中都这样做了。

为了消除冗余和模块化,我在BaseController.java类中创建了一个基本导航方法,该方法将由系统中的所有控制器扩展。此类对于添加任何公共功能和共享属性都很有用。

以下方法navigate(Event event, URL fxmlDocName)是我们所有系统导航中使用的最重要的代码之一(注释说明了工作机制):

protected void navigate(Event event, URL fxmlDocName) throws IOException {
  //Loading new fxml UI document
  Parent pageParent = FXMLLoader.load(fxmlDocName);
  //Creating new scene
  Scene scene = new Scene(pageParent);
  //get current stage
  Stage appStage = (Stage)((Node) event.getSource()).getScene().getWindow();
  //Hide old stage
  appStage.hide(); // Optional
  //Set stage with new Scene
  appStage.setScene(scene);
  //Show up the stage
  appStage.show();
}

此方法将从ListNotesUIController.javaListNotesUI.fxml页面中的新建注释和编辑按钮以及AddEditUIController.java列表注释中的新建注释和编辑按钮的动作处理程序中调用,并分别在AddEditUIController.javaAddEditUI.fxml页面中保存和取消按钮,如下所示。

注意 FXML 文档中定义的按钮与控制器之间的关系。@FXML注释在这里发挥作用,使用将 FXML 属性(与控制器中定义的操作绑定在一起:

ListNotesUI.fxml文件中新注释按钮定义如下:

<Button alignment="TOP_CENTER"
        contentDisplay="TEXT_ONLY"
        mnemonicParsing="false"
        onAction="#newNote" 
        text="New Note" 
        textAlignment="CENTER" 
        wrapText="true" 
/>

新注释动作在ListNotesUIController.java中定义,使用onAction="#newNote"绑定到前面的按钮:

@FXML
 private void newNote(ActionEvent event) throws IOException {
        editNote = null;
        navigate(event, ADD.getPage());
 }

AddEditUI.fxml文件中后退按钮定义如下:

<Button alignment="TOP_CENTER"    
        contentDisplay="TEXT_ONLY"
        mnemonicParsing="false"
        onAction="#back" 
        text="Notes List" 
        textAlignment="CENTER"
        wrapText="true"
/>

后退动作在AddEditUIController.java中定义,使用onAction="#back"绑定到前面的按钮:

@FXML
private void back(ActionEvent event) throws IOException {
        navigate(event, FXMLPage.LIST.getPage());
}

你可能想知道FXMLPage.java类做什么。这是一个枚举(有关枚举的更多信息,请访问https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html 。除了与这些 FXML 文档相关的任何实用方法之外,我还创建了枚举来定义所有 FXML 文档名称及其位置,这有助于简化系统中的编码。

提示

这种可维护性的概念有助于大型系统在一个地方保持恒定的属性和功能,以便于将来的重构,并允许我们在一个地方更改名称,而不是在整个系统中漫游,只更改一个名称。

如果您检查系统控制器,您将找到处理其他按钮操作的所有逻辑–删除、编辑、清除和保存注释。

电力应用变更与属性同步

属性是基于 JavaFX 的对象属性(如字符串或整数)的包装器对象。属性允许您添加侦听器代码,以便在对象的包装值已更改或标记为无效时作出响应。此外,属性对象可以相互绑定。

绑定行为允许属性根据另一个属性更改的值更新或同步其值。

属性是包装器对象,能够使值以读/写或只读方式访问。

简而言之,JavaFX 的属性是包装器对象,在提供更改支持、失效支持和绑定功能的同时保存实际值。稍后我将讨论绑定,但现在,让我们检查一下常用的属性类。

所有包装器属性类都位于javafx.beans.property.* package命名空间中。这里列出了常用的属性类。要查看所有属性类,请参阅 Javadoc(中的文档 https://docs.oracle.com/javase/8/javafx/api/index.html?javafx/beans/property.html

  • javafx.beans.property.SimpleBooleanProperty
  • javafx.beans.property.ReadOnlyBooleanWrapper
  • javafx.beans.property.SimpleIntegerProperty
  • javafx.beans.property.ReadOnlyIntegerWrapper
  • javafx.beans.property.SimpleDoubleProperty
  • javafx.beans.property.ReadOnlyDoubleWrapper
  • javafx.beans.property.SimpleStringProperty
  • javafx.beans.property.ReadOnlyStringWrapper

前缀为Simple且后缀为Property的属性为可读写属性类,前缀为 ReadOnly 且后缀为 Wrapper 的类为只读属性。稍后,您将看到如何使用这些常用属性创建 JavaFXbean。

让我们快速转到 JavaFX 的 Properties API,看看它如何处理常见问题。您可能会注意到,TableView控件已添加到主页面,以列出当前加载的注释和任何新添加的注释。

为了用数据正确填充TableView,我们应该有一个数据模型来表示 notes 数据,这是我在 JavaFX JavaBean 样式的 notes 类中使用 Properties API 的第一个地方,定义如下:

public class Note {
    private final SimpleStringProperty title;
    private final SimpleStringProperty description;
    public Note(String title, String description) {
        this.title = new SimpleStringProperty(title);
        this.description = new SimpleStringProperty(description);
    }
    public String getTitle() {
        return title.get();
    }
    public void setTitle(String title) {
        this.title.set(title);
    }
    public String getDescription() {
        return description.get();
    }
    public void setDescription(String description) {
        this.description.set(description);
    }
}

例如,为了用已经存储在应用数据库中的数据填充TableView类(我们的数据库使用名为 data 的 note 对象的ObservableList<Note>是瞬态的),我们必须传递这些数据的集合。

我们需要来消除每次更新 notes 数据采集时手动更新 UI 控件(在我们的例子中为TableView控件)的负担。因此,我们需要一个解决方案来自动同步表视图和 notes 数据收集模型之间的更改,例如,添加、更新或删除数据,而无需从代码中进一步修改 UI 控件。仅更新数据模型集合–UI 应自动同步。

此功能已经是 JavaFX 集合的一个组成部分。我们将使用 JavaFX 的ObservableList类。ObservableList类是一个集合,能够在添加、更新或删除对象时通知 UI 控件。

JavaFX 的ObservableList类通常用于列表 UI 控件,如ListViewTableView。让我们看看如何使用ObservableList集合类。

BaseController中,我将静态数据创建为ObservableList<Note>以便在所有控制器之间共享,以便能够添加、更新和删除其中的注释。此外,它使用一些数据进行初始化,如下所示:

protected static ObservableList<Note> data = FXCollections.<Note>observableArrayList(
  new Note("Note 1", "Description of note 41"),
    new Note("Note 2", "Description of note 32"),
    new Note("Note 3", "Description of note 23"),
    new Note("Note 4", "Description of note 14"));

ListNotesUIController.java类中,在initialize()方法中,我创建了javafx.collections.transformation.FilteredList类的一个实例,当我们在表内容中搜索时,该实例将用作过滤类。将ObservableList<Note>类型的data对象作为源数据传递:

FilteredList<Note> filteredData = new FilteredList<>(data, n -> true);

FilteredList的第二个参数是用于过滤数据的谓词;在这里,它返回true,表示没有过滤,稍后我们将添加过滤谓词。

创建的ObservableList<Note>类型的数据列表应该传递给我们的TableView数据,以便表视图监控当前的数据采集操作,如添加、删除、编辑和过滤,如ListNotesUIController.java类的initialize()方法中所述,但我们传递的是filteredData包装器实例:

notesListTable.setItems(filteredData);

最后一步是确认我们的notesListTable列,类型为TableColumn,以及要呈现和处理的 Note 类的哪个属性。我们使用setCellValueFactory()方法来做这个把戏,如下所示:

titleTc.setCellValueFactory(new PropertyValueFactory<>("title"));
descriptionTc.setCellValueFactory(new PropertyValueFactory<>("description"));

注意,titledescriptionNote类的实例变量名。

检查最终项目代码是否完全执行。然后,从 NetBeans 主菜单运行应用,选择运行,然后单击运行主项目

尝试添加新便笺,并在表视图中查看新添加的便笺。尝试选择并删除注释或更新现有注释。你会立即注意到变化。

通过检查应用代码,您将看到我们所做的一切都是在数据列表中操作的,所有其他同步工作都是在ObservableList类的帮助下进行的。

过滤 TableView 数据列表

我们将在这里与两个最强大的 JavaSE8 和 JavaFX8 特性PredicateFilteredList取得联系。让我们陈述一下我们手头的问题,以及我们将如何使用stream功能来解决它。

在我们的ListNotesUI.fxml页面中,您可能会注意到 notes 表上方的文本字段;它在这里的目的是过滤当前表数据,以缩小结果范围,从而获得特定的注释。此外,我们需要维护当前列表,注意不要从中删除任何数据,也不要为每个搜索命中查询数据库。

我们已经有了 notes 数据列表,我们将使用文本字段筛选此列表中包含此字符或字符组合的任何备注标题或说明,如下所示:

Filtering the TableView data list

用数据填充的表

现在,在输入ddedevdevelopingJavaFX后,将过滤一个表,如下面的屏幕截图所示。此外,尝试删除所有文本;你会发现数据又回来了。接下来,我们将了解我们是如何做到这一点的。

Filtering the TableView data list

使用搜索字段中的文本筛选的表数据

下面是一段神奇的代码:

searchNotes.setOnKeyReleased(e ->
{
  filteredData.setPredicate(n ->
  {              
if (searchNotes.getText() == null || searchNotes.getText().isEmpty())
return true;

return n.getTitle().contains(searchNotes.getText())
|| n.getDescription().contains(searchNotes.getText());
  });
});

searchNotes是对我们用来过滤 notes 数据的文本字段的引用。我们已经用一个setOnKeyReleased(EventHandler<? super KeyEvent> value)方法注册了它,该方法可以在输入任何字符后过滤文本。另外,请注意,我们在这里使用 Lambda 表达式使代码更加简洁和干净。

在 action 方法的定义中,filteredData是一个FilteredList<Note>类,我们将谓词test()方法实现传递给setPredicate(Predicate<? super E> predicate)只过滤与searchNotes文本输入匹配的注释标题或描述。

过滤后的数据将自动更新到表 UI。

有关谓词 API 的更多信息,请访问http://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html

笔记作为桌面应用

一旦您完成了应用,不分发最终的 jar,而是要求用户安装 JRE 环境,以便能够运行您的应用,这将更加专业,特别是如果您的目标受众众多。

更专业的做法是将您的原生安装程序包准备为.exe.msi.dmg。或.img

每个安装程序都管理来自所需资产和运行时环境的应用需求。这可以确保应用也可以在多个平台上运行。

部署桌面分发应用

高级 NetBeans 功能之一是允许您通过部署处理程序为不同平台绑定应用,这为您提供了以下主要功能:

  • 通过本机安装程序部署应用
  • 将应用资产管理为应用图标、启动屏幕和本机安装程序图标
  • 在准备最终文件包时,接受申请的最终签名证书
  • 管理所需的 JavaFX 运行时版本
  • 使用 Windows 时添加“开始”菜单的桌面快捷方式
  • 处理 JavaWebStart 技术需求和定制

让我们看看 NetBeans 部署的配置:

Deploying the application for desktop distribution

NetBeans 部署配置

要了解如何将应用打包到目标平台的本机安装程序中,请访问以下 URL,该 URL 为您提供完成任务所需的所有步骤和软件:

https://netbeans.org/kb/docs/java/native_pkg.html

网络上的 JavaFX

在本节中,我们将了解 Web 上的 JavaFX 以及如何在 Web 上部署我们的笔记应用。

网络引擎

JavaFX 提供了一个能够加载 HTML5 内容的非 GUI 组件,称为WebEngineAPI(javafx.scene.web.WebEngine。该 API 基本上是WebEngine类的对象实例,用于加载包含 HTML5 内容的文件。HTML5 文件可以从本地文件系统、web 服务器或 JAR 文件中加载。

当使用 web 引擎对象加载文件时,后台线程用于加载文件内容,以不阻止JavaFX 应用线程

以下是加载 HTML5 内容的两种WebEngine方法:

  • 加载(字符串 URL)
  • 加载内容(字符串 HTML)

网络视图

JavaFX 提供了一个 GUIWebViewjavafx.scene.web.WebView节点),可以将 HTML5 内容渲染到场景图上。WebView节点基本上是一个迷你浏览器,能够响应 web 事件,并允许开发人员与 HTML5 内容交互。

由于加载 web 内容和显示 web 内容的能力之间的密切关系,WebView节点对象还包含一个WebEngine实例。

JavaFX8WebView类实现支持以下 HTML5 特性:

  • 画布和 SVG
  • 媒体播放
  • 窗体控件
  • 历史维护
  • 交互式元素标记
  • 多姆
  • 网络工作者
  • Web 套接字
  • 网络字体

网络视图和引擎正在运行

我们将有一个简单的示例,说明如何加载 HTML5 web 文档,该文档包含与 JavaFX 集成的 Google 地图,并使用WebView作为场景控件。然后,我们使用WebEngine从 JavaFXTextField控件获取经度和纬度,执行一个 JavaScript 方法,该方法通过这些参数将地图定位到中心位置,并带有标记指示,如下图所示:

WebView and engine in action

JavaFX8 应用中的 Google 地图查看器

为了清楚起见,我将仅展示和解释代码的重要部分,这表明了前一段中提到的概念。对于本章中的完整代码,请查看web包代码GoogleMapViewerFX.java类和map.html文件。

要在 JavaFX 应用中查看 Google Maps,我们需要首先创建一个 HTML 文件来加载并与 Maps API 集成,这是在map.html文件中定义的。如上图所示,位置以开罗、埃及、我的城市为中心,设置为创建地图时传递给地图的经度和纬度值,如以下代码片段所示:

var latlng = new google.maps.LatLng(30.0594885, 31.2584644);
var Options = {
    zoom: 13,
    center: latlng,
    mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById("canvas"), Options);

接下来,我们要注意 JavaScriptgoToLocation(lng, lat)方法;这将从 JavaFX 应用调用,使用webEngine实例根据 JavaFX 控件传递的经度和纬度定位地图。

GoogleMapViewerFX.java内部,我们创建了四个控件来组成我们的 UI–两个经纬度TextField类、一个更新按钮和一个查看map.html文档的WebView对象:

WebView webView = new WebView();
WebEngine webEngine = webView.getEngine();
final TextField latitude = new TextField("" + 29.8770037);
final TextField longitude = new TextField("" + 31.3154412);
Button update = new Button("Update");

请注意,我创建了具有初始经度和纬度的文本控件,这与原始地图位置不同。此位置是我的主位置,您可以将其更改为您的,然后单击“更新”以查看新位置。

要加载map.html文件,我们必须将其传递给我们从已经创建的WebView类创建的WebEngine类,如前面的代码片段所示。

实现按钮的onAction()方法,允许使用webEngine``executeScript()方法集成 JavaFX 控件和 JavaScript,如下代码所示:

update.setOnAction(evt -> {
   double lat = Double.parseDouble(latitude.getText());
   double lon = Double.parseDouble(longitude.getText());

   webEngine.executeScript("" +
             "window.lat = " + lat + ";" +
             "window.lon = " + lon + ";" +
             "document.goToLocation(window.lat, window.lon);");
});

运行应用,您应该会看到前面定位到开罗市的图!点击 update,您应该可以到达我家,如下图所示。

尝试获取您的位置经度和纬度;那也去你家吧!

很强大,不是吗?集成 HTML5 内容并与已经开发的 web 应用交互非常容易,可以将更多丰富的 web 内容添加到现有的 JavaFX 应用中。

WebView and engine in action

在 JavaFX8 应用中更改 Google 地图的位置

记笔记作为 web 应用

正如我们前面所讨论的,一旦您的应用经过测试,您就可以将应用分发到多个平台和环境。我们已经使用本章中分发的项目dist文件夹下的.jar文件为本机安装程序的台式机完成了这项工作。

相同的.jar文件将用于 web 部署,应用可以通过多种方式部署为 web 应用,我们将在下面看到。

为 Web 运行应用

在 Web 上运行 JavaFX 应用有三种方法:

  1. 使用Java Web Start下载并启动您的应用一次;然后,您可以从计算机脱机使用它
  2. 将 JAR 嵌入 HTML 文件以从企业环境运行
  3. 如前所述,从WebEngine类加载 HTML 内容并从WebView类查看

Java Web Start

Java Web Start 软件提供了只需单击即可启动全功能应用的能力。用户可以下载和启动应用,例如完整的电子表格程序或 Internet 聊天客户端,而无需经过冗长的安装过程。

使用 JavaWebStart,用户可以通过单击网页上的链接来启动 Java 应用。该链接指向一个JNLPJava 网络启动协议)文件,该文件指示 Java Web Start 下载、缓存和运行应用。

Java Web Start 为 Java 开发人员和用户提供了许多部署优势:

  • 使用 JavaWebStart,您可以在 Web 服务器上放置单个 Java 应用,以便部署到各种平台,包括 Windows、Linux 和 Solaris。
  • 它支持 Java 平台的多个同时版本。应用可以请求特定版本的 Java 运行时环境(JRE)软件,而不会与其他应用的需求发生冲突。
  • 用户可以创建桌面快捷方式,在浏览器外部启动 Java Web Start 应用。
  • JavaWebStart 利用了 Java 平台固有的安全性。默认情况下,应用限制对本地磁盘和网络资源的访问。
  • 使用 JavaWebStart 启动的应用在本地缓存以提高性能。
  • 当应用从用户桌面独立运行时,会自动下载对 Java Web Start 应用的更新。

Java Web Start 是作为 JRE 软件的一部分安装的。用户不必单独安装 JavaWebStart 或执行其他任务来使用 JavaWebStart 应用。

有关Java Web Start的更多信息,请参见以下链接:

为 web 分发部署应用

要将 JavaFX 应用部署到 Web 上,有一种使用 NetBeans 的非常简单的方法。

NetBeans 已经为您的 JavaFX 应用提供了三种部署类型–桌面、Java Web Start 和 Web,如下图所示:

Deploying the application for a web distribution

总结

到目前为止,我们一直在学习如何为台式机和 Web 开发 JavaFX 企业应用。

在本章中,我们获得了开发任何应用的技能,首先是在一张纸上绘制布局;接下来,我们将其转换为一个实际的交互式、丰富多彩的 UI 原型。我们了解了如何嵌套容器和控件以实现所需的布局。一旦我们获得了最终开发的批准,我们就通过使应用响应客户的操作和交付功能需求,使应用充满活力。

利用 JavaSE8 特性和 JavaFX 绑定的强大功能,我们使代码更加强大、干净和简洁。最后,我们学习了如何将应用部署到不同平台和环境的目标桌面客户或 Web 用户。

在下一章中,我们将学习如何为基于 Android 的智能手机开发 JavaFX 应用。此外,我们还将学习下载和安装 Android SDK 工具所需的技能,以及与记录器、模拟器和其他工具进行交互的技能,这些工具将帮助您进行与 JavaFX 无关的任何未来移动开发。