DOC-13-06 用JavaFX实现Swing应用程序

在本章中,你将参考Swing应用程序并学习如何用JavaFX实现它。

为了实现本章的目的,先熟悉图6-1所示的Converter应用程序。此程序可以换算公制和美制的距离测量单位。

图6-1 用Java开发的Converter应用程序

13_6_1 converter_java

分析用Swing开发的Converter应用程序

想了解更多关于用Java开发本例的实现细节,请参考Swing教程中的“如何使用面板”和“使用模型”章节。特别是关于面板的教程中讨论了图形用户界面(GUI)。

为了学习Converter应用程序的代码,请下载它的NetBeans工程或样例索引中提供的源文件。

Swing组件使用模型。如果你查看工程的内容,会注意到在Converter应用程序中定义模型的ConverterRangeModel和FollowerRangeModel类。

Converter应用程序由下列文件组成:

● ConversionPanel.java – 包括一个自定义用来容纳组件的JPanel子类

● Converter.java – 包括主程序类

● ConverterRangeModel.java – 定义顶部滑块的模型

● FollowerRangeModel.java – 定义底部滑块的模型

● Units.java – 创建Unit对象

注意在每个文本框和对应滑块之间的同步由监听值改变的事件处理器实现。

设计用JavaFX开发Converter应用程序

Converter应用程序包含两个相似的面板,面板中容纳了组件如文本框、滑块和下拉框。面板有标题。javafx.scene.control 中的TitlePane类非常适合这个Converter应用程序的GUI。

在下文中,你将实现ConversionPanel类并在Converter应用程序图形场景中添加此类的两个实例。

首先,注意单个ConversionPanel对象中的组件应该像如下所说的进行同步。当你移动滑块的按钮时,必须更新文本框中的值。反过来也一样,当你改变文本框中的值时,必须调整滑块中按钮的位置。

当你选择下拉框中的另一个值时,必须更新文本框中的值,因此也会改变滑块按钮的位置。

其次,注意两个ConversionPanel对象也需要同步。当一个面板发生改变时,另一个面板对应的组建也必须更新。

建议你使用DoubleProperty对象(命名为meters)来实现面板之间的同步,创建并注册两个InvalidationListener对象(fromMeters和toMeters)来监听文本框和下拉框属性的改变。当一个面板的文本框的属性改变时,绑定的InvalidationListener对象的invalidated方法被调用,将会更新meters属性。而因为meters属性改变,绑定于meters属性的InvalidationListener对象的invalidated方法被调用,将会更新另一个面板对应的文本框。

相似的,当一个面板的下拉框属性改变时,绑定的InvalidationListener对象的invalidated方法被调用,将会更新这个面板对应的文本框。

为了提供滑块的值和meters对象的值之间的同步功能,请使用双向绑定。

想了解更多关于JavaFX属性和绑定的信息,请查看“使用JavaFX属性和绑定”。

用JavaFX创建Converter应用程序

在NetBeans中创建一个新的JavaFX工程并命名为Converter。将Swing应用程序中的Unit.java文件复制到Converter工程。在工程中添加一个新的java类并命名为ConversionPanel.java。

创建GUI的标准JavaFX模式

在你使用JavaFX创建Converter应用程序的GUI之前,先看一下Swing应用程序中创建GUI的标准模式,如例6-1所示。

例6-1

为了将这种模式匹配到JavaFX中,需要扩展javafx.application.Application类,重写start方法并调用main方法,如例6-2所示。

例6-2

当你在NetBeans IDE中创建新的JavaFX工程时,将会自动生成这种模式。但是,重要的是你需要知道用JavaFX创建GUI的基本方法,特别是当你使用一个文本编辑器时。

容器和布局

在Swing中,容器和布局管理器是不同的实体。你创建一个容器,如JPanel或JComponent对象,并为其设置一个布局管理器。你可以指定一个特定的布局管理器并在代码中写入.add()或不指定布局管理器。

在JavaFX中,容器本身负责布局其子节点。你创建一个特定布局面板,如Vbox、FlowPane或者TitledPane对象,然后使用.getChildren().add()方法向其子节点列表中添加内容。

在JavaFX中有很多布局容器类,被称为窗格(panes),其中一些类在Swing中有类似的类,如JavaFX中的FlowPane类对应Swing中的FlowLayout类。

想了解更多信息,请查看“在Java中使用布局”。

UI控件

JavaFX SDK提供了一套标准UI控件。其中一部分在Swing中有类似的控件,如JavaFX中的Button类对应Swing中的JButton;JavaFX中的Slider对应Swing中的JSlider;JavaFX中的TextField对应Swing中的JTextField。

为了用JavaFX实现Converter应用程序,你可以使用TextField,Slider和ComboBox类提供的标准UI控件。

想了解更多信息,请查看“使用JavaFX UI控件”。

获取用户操作和绑定通知的机制

在Swing中,你可以在任何组件上注册一个监听器并监听组件属性的改变,如大小、位置或者可见性;或者监听事件,如组件获得或者失去键盘焦点;或者鼠标在组件上点击、按下或者抬起。

在JavaFX中,每个对象有一组属性,每个属性都可以注册一个监听器。当属性的值改变时,监听器将会被调用。

注意一个对象可以注册为监听另一个对象属性改变的监听器。因此你可以使用绑定机制来同步两个对象的部分属性。

创建ConversionPanel类

ConversionPanel类用来装载组件:一个文本框、一个滑块和一个下拉框。当Converter应用程序的图形场景被创建时,在其中添加两个ConversionPanel类的实例。如例6-3所示,添加TitledPane类的引用声明,并让ConversionPanel类继承它。

例6-3

创建UI控件的实例变量

添加TextField、Slider、ComboBox控件的引用声明,并定义每个控件的实例变量,如例6-4所示。

例6-4

创建DoubleProperty和NumberFormat对象

如例6-5所示,添加DoubleProperty和NumberFormat类的引入声明,以及创建一个DoubleProperty对象并命名为meters。Meters对象用来确保两个ConversionPanel对象间的同步。

例6-5

放置组件

使用VBox类来放置文本框和滑块。使用HBox来放置以上两个组件和下拉框。添加ObservableList类的引入声明,并实现ConversionPanel类的构造方法,如例6-6所示。

例6-6

代码的最后一行在ComboBox对象中选择了一个值。

创建InvalidationListener对象

为了监听文本框和滑块的属性改变,创建InvalidationListener对象fromMeters和toMeters,如例6-7所示。

例6-7

 

在控件中添加改变监听器以确保同步

为了提供在文本框和下拉框之间的同步,如例6-8所示添加改变监听器。

例6-8

在滑块值和meters对象值之间创建双向绑定,如例6-9所示。

例6-9

当在文本框中输入一个新值时,toMeters监听器的invalidated方法被调用,将会更新meters对象的值。

创建Converter类

打开NetBeans IDE自动的Converter.java文件,删除main方法以外的所有代码。然后按Ctrl(或Cmd)+Shift+I来修正引入声明。

定义实例变量

添加ObservableList、DoubleProperty和SimpleDoubleProperty类的引入声明,创建适当类型的metricDistances、usaDistances和meters变量,如例6-10所示。

例6-10

创建Converter类的构造方法

在Converter类的构造方法中,创建公制和美制距离的Unit对象,如例6-11所示。添加FXCollections类的引入声明,然后用这些units初始化两个ConversionPanel对象。

例6-11

创建图形场景

重写start方法以创建Converter应用程序图形场景。在图形场景中添加两个ConversionPanel对象并垂直放置。注意两个ConversionPanel由同样的meters对象初始化。使用VBox作为图形场景的根容器。如例6-12所示初始化两个ConversionPanel对象。

例6-12

你可以使用文档底部的链接来查看源代码和下载JavaFX的Converter应用程序的NetBeans工程。

JavaFX的Converter应用程序如图6-2所示

图6-2 JavaFX的Converter程序

13_6_2 converter_fx

比较分别用Swing和JavaFX实现的具有相同功能的两个程序。

Swing应用程序包含5个文件,相比起来JavaFX应用程序只包含3个文件,而且JavaFX的代码也更简洁。两个程序在外观和感觉上也不一样。

应用程序资源

源代码

Converter.java

ConversionPanel.java

NetBeans项目

Converter.zip

打赏一下
支付宝
微信
除非注明,博客文章均为原创,转载请标明文章地址
本文地址: http://www.javafxchina.net/blog/2015/09/doc-13-06-implement-swing-app-in-fx/
百度已收录