扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
因为声明式编程(declarative programming)可以从单个表达式创建程序,如前面第一个例子,表达式的根一般为一个生成程序的对象图形的对象分配表达式(构造器)。
添加动态行为(dynamic behavior)
上面的“Hello World”程序没有动态行为。在JavaFX中创建一个带动态行为的图形用户接口,即创建一个属性依赖其他对象属性值的图形用户接口组件(和Flex中的绑定的概念一致)。这些其他对象可以是任何您觉得合适的代表您的应用状态的对象。因为该GUI组件的属性依赖于另一个对象,它会自动反应任何时候您对另一个对象的修改。相应的,GUI组件是视图(View)而另一个对象就是模型(Model),下面是“Hello World”程序的Model/View版本:
import javafx.ui.*; class HelloWorldModel { attribute saying: String; } var model = HelloWorldModel { saying: "Hello World" }; var win = Frame { title: "Hello World JavaFX" width: 200 height: 50 content: Label { text: bind model.saying } visible: true }; |
运行程序显示如下:
如果model对象的saying改成下面这样:
model.saying = "Goodbye Cruel World!"; |
运行结果将变为下图所示:
注意该示例通过JavaFX的bind操作将label的text属性初始化为mode的saying属性。在这里,bind操作声明增量更新。这意味着任何时候model.saying改变,label的text属性都将更新为相同的值。
对于输入构件,如按钮、复选框和文本输入域,模式属性和GUI组件之间的连接可以是双向的。
考虑以下示例:
import javafx.ui.*; class HelloWorldModel { attribute saying: String; } var model = HelloWorldModel { saying: "Hello World" }; var win = Frame { title: bind "{model.saying} JavaFX" width: 200 height: 50 content: TextField { value: bind model.saying } visible: true }; |
运行该程序,显示如下:
如果您在文本输入域中输入其他内容然后敲回车,窗口的标题将相应的改变:
在这一情况下,文本域的值的更新是用户输入的结果(通过TextField类的实现)。当model的saying属性更新到与文本域相同值发生时,因为该表达式指定窗口的title属性依赖于model的saying属性,表达式被重新计算并且窗口的title属性更新到上面的结果。但是,这样的内容表达依然是声明。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者