利用JavaFX工具构建Reactive系统
javafx 是java中用来构建图形应用程序的新的标准库, 但许多程序员仍然坚持在使用swing甚至awt。关于如何利用javafx工具集中的新的超棒特性来构建响应式的快速应用程序,这里有一些建议!
1. 属性值
如果你对javafx组件做过完整的了解,移动遇到过属性(property)这个东西。fx库中几乎每个值都可以被观察,分区(divider)的宽度,图片的尺寸,文本标识(label)中的文字,一个列表中的子项以及复选框(checkbox)的状态。属性分成另类:可写属性和可读属性。可写值可以被修改,使用设置器方法或者直接修改。 javafx 会处理事件处置过程并确保每个依赖于此属性的组件都会被通知到。可读属性拥有能让你在其值被修改时接收到通知的方法。
示例:
// 可读-且可写 stringproperty name = new simplestringproperty("emil"); // 只读 observablebooleanvalue nameisempty = name.isempty();
2. 绑定值
当你拥有一个可写和可读值的时候,你可以开始就这些值如何关联定义规则。一个可写属性可以被绑定到一个可读属性,如此其值总是会匹配到可读的这个。绑定并不会立即发生,不过它们会在值被观察之前进行(看看我在那里做的就明白了)。 绑定可以是单向或者双向的。当然,如果它们之间是双向的,就需要两个属性都是可写的。
示例:
textfield fielda = new textfield(); textfield fieldb = new textfield(); fielda.prefwidthproperty().bind(fieldb.widthproperty());
3. 可观察的列表
属性并不是唯一可以被观察的东西。如果列表是被封装到了一个 observablelist 中,那么列表的成员同样也是可以被观察到的。observablelist 的响应模型是相当先进的。你不仅能在列表被修改时收到通知,也可以看到列表具体是如何被修改的。
示例:
list<string> otherlist = arrays.aslist("foo", "bar", "bar"); observablelist<string> list = fxcollections.observablelist(otherlist); list.addlistener((listchangelistener.change<? extends string> change) -> { system.out.println("received event."); while (change.next()) { if (change.wasadded()) { system.out.println( "items " + change.getaddedsublist() + " was added."); } if (change.wasremoved()) { system.out.println( "items " + change.getremoved() + " was removed."); } } }); system.out.println("old list: " + list); list.set(1, "foo"); system.out.println("new list: " + list);
上面代码的运行输出如下:
old list: [foo, bar, bar] received event. items [foo] was added. items [bar] was removed. new list: [foo, foo, bar]
如你所见,设置操作只会触发一次事件。
4. stringconverter
有时你会发现自己要创建一个绑定时无需去提取一个组件中的值。 这个的典型示例就是你有了一个从一个文本域(textfield)获取到的带有path 的 stringproperty。如果你想要有一个带有表示为path的这个值的可观察属性,就需要去为它创建一个stringconverter。
示例:
textfield filelocation = new textfield(); stringproperty location = filelocation.textproperty(); property<path> path = new simpleobjectproperty<>(); bindings.bindbidirectional(location, path, new stringconverter<path>() { @override public string tostring(path path) { return path.tostring(); } @override public path fromstring(string string) { return paths.get(string); } });
对象属性并不是跟文本域的值进行的双向绑定。
5. expressions
使用上述的 bindings类,你可以创建出任何类型的表达式。比如说你有了两个可以让用户输入信息的文本域。现在想要定义一个只读域,其中总是会包含一个字符串,如果两个串的长度相等,将会是两个串逐个字符间隔混在一起进行显示。如果长度不等,则显示一条帮助信息。
示例:
textfield first = new textfield(); textfield second = new textfield(); textfield mix = new textfield(); mix.textproperty().bind( bindings.when( first.lengthproperty().isequalto(second.lengthproperty()) ).then(bindings.createstringbinding( () -> { int length = first.lengthproperty().get(); string firsttext = first.textproperty().get(); string secondtext = second.textproperty().get(); char[] result = new char[length * 2]; for (int i = 0; i < length; i++) { result[i * 2] = firsttext.charat(i); result[i * 2 + 1] = secondtext.charat(i); } return new string(result); }, first.textproperty(), second.textproperty() )).otherwise("please enter two strings of exactly the same length.") );
这里只是javafx诸多特性的其中一点点。希望你可以找到更多利用这个事件系统的创造性方式!
上一篇: asp.net TextBox回车触发事件 图片在img显示
下一篇: AJAX的使用方法详解
推荐阅读
-
利用JavaFX工具构建Reactive系统
-
科讯网站管理系统 Kesion v6.5 CMS Oday 利用工具
-
利用电脑系统自带清理工具清理电脑垃圾
-
crosstool-ng构建STM32F1x系列交叉编译工具链--1、ubuntu系统安装
-
《PHP 源代码分析》第一章 构建系统 之 准备工具、库及需要具备
-
《Docker容器:利用Kubernetes、Flannel、Cockpit和Atomic构建和部署》——2.2 容器式Linux系统的Docker配置...
-
《PHP 源代码分析》第一章 构建系统 之 准备工具、库及需要具备
-
不利用系统漏洞拿shell,kali强大工具Responder
-
利用Eclipse工具 Maven构建简单的SpringBoot项目
-
《构建实时机器学习系统》一3.3 利用 Pandas 分析实时股票报价数据