javafx新替代者(JavaFX绑定探究)

本文目录
JavaFX绑定探究
数据绑定连接一些对象并且使它们同步 尽管Swing的开发者们取决于额外的类库 但是绑定是完全融入了JavaFX Script编程语言 仔细看一看它运行的库显示了一个完全绑定构架 其基本概念与JGoodies Binding 和 Beans Binding很相似(在我以前的文章 Binding Beans 中有做过比较) JSR (Beans Binding)可能不会成为Java 的一部分 所以一直寻找可代替品的开发者们会问自己 JavaFX绑定构架是否可以通过简单的Java程序而进行使用
JavaFX建立在普通的Java SE运行上 为了在本文中展示这个示例 你需要为你的操作系统(在此只支持官方的Windows 和Mac OS X)下载合适的JavaFX SDK 具体请参考Resources 安装installation过程只需要几个步骤 在Windows的机器上 默认安装地址是C:\Program Files\JavaFX\javafx sdk Mac OS X users should look at /Library/Frameworks/JavaFX framework/Versions/
图 JavaFX SDK基础目录
图 显示了JavaFX SDK的基础目录 这个bin目录包括可执行编译并运行JavaFX Script程序 我们不使用它们 JavaFX(Script)documentation在docs中 文件src zip包括部分JavaFX运行的来源 如果你打开它 你会注意到文件是以stg 和 st结尾的 最后lib和它的子目录包含库 jars 本文的示例取决于它们中的一些
Locations
lib/shared/javafxrt jar包含 sun javafx runtime location包 它的类和接口来自基本的JavaFX Binding的构建块 例如 Location接口代表一个值 它可能是可变的或是不能改变的 有效或无效的 空的或是非空 这样的状态可以通过相应的getters来查询 例如 isMutable() 如果Location的值是无效的 当update()方法被调用时 或该值被检索时 它会被更新
一个Location的类型是通过子接口来决定的;例如 IntLocation 如果你要在src zip中查询IntLocation java 你不会看到它 这是因为它的来源是来自两个文件XxxLocation st 和XxxTemplate stg 每个子接口为类型XYZ添加getAsXYZ和and setAsXYZ() 还有DoubleLocation FloatLocation ShortLocation CharLocation LongLocation BooleanLocation ByteLocation和 ObjectLocation
其他的对象可能会附属于一个Location 当值与地址变化联系在一起的时候 change listeners可以接收到通知 最后 Locations是很懒惰的 虽然当值无效的时候change listeners会得到通知 但是新的值不会被重新计算直到需要它的时候 到目前为止 我指谈论了接口的问题 当然 可以为我以上所提到的类型而随时执行Locations
public static void main(String args) {
final IntVariable i = IntVariable make( );
i addChangeListener(new ChangeListener() {
@Override
public boolean onChange() {
System out println( onChange(): + i get());
return false;
}
});
System out println(i get() +
isMutable(): + i isMutable());
IntLocation i = IntConstant make( );
System out println(i get() +
isMutable(): + i isMutable());
i set(i get());
}
为了编译并运行LocationDemo 请附加lib/shared/javafxrt jar到你的类路径上 这个演示示例采用了IntVariable 和IntConstant类 两个都执行了IntLocation接口 因此是Locations 使用静态make()方法创建Instances 使用get()查询当前值 正如你在图 中所看到的 在初始化引发一个通知之后 设置一个值 它通过子抽象类ChangeListener来进行处理
图 LocationDemo 输出
当地址内容已经改变的时候 它的onChange()方法被调用 该方法返回一个Boolean值 指示监听者是否仍然有效 返回false将导致监听者从监听者名单上删除 Javadoc建议 当相关的弱引用被报告清除的时候 那些做它们自己弱引用管理的监听者应该返回false
就像JGoodies Binding的ValueModel 还有Beans Binding的Property一样 Locations 读取和编写类型值提供了一个方法 它们也可以通知注册的监听者关于值的变化 最后 你将会在以下的小节中看到它们用于建立绑定
建立绑定
像Beans Binding 和JGoodies Binding一样 JavaFX运行包含一个辅助类来建立绑定 sun javafx runtime location Bindings 它是用于在两个Locations之间建立bijective关系 这个意思是说如果一个值被更新 它所对应的也会被更新 在Locations被实例之后 它们被传递到bijectiveBind()
public class BindingDemo {
private static IntLocation i i ;
public static void main(String args) {
i = IntVariable make();
i = IntVariable make();
Bindings bijectiveBind(i i );
showValues();
i setAsInt( );
showValues();
i setAsInt( );
showValues();
}
private static void showValues() {
System out println( i : + i get());
System out println( i : + i get());
}
}
bijectiveBind(i i )在i 和 i 之间建立两种依赖关系 如果其中一个被更新 例如 调用setAsInt() 其他的值也会变化 为了到达此目的 执行附加了两个监听者在Locations中分享状态 方便的方法makeBijectiveBind()创建一个新的Location并它绑定到现存的绑定上面 如下所示
i = IntVariable make();
i = Bindings makeBijectiveBind(i );
BindingDemo 展示了如何使用它 它包含在/today/ / / /sources zip中 具体细节请参考Resources 图 显示了它的输出
图 BindingDemo 输出
请注意只有可编译的类型才能使用bijectiveBind()来进行绑定 以下的代码行取自BindingDemo java(包含在sources zip中的) 第一眼看上去代码没什么问题 但是 它们会抛出ClassCastException异常 这里发生什么事情了呢?
ObjectLocation loc = IntVariable make();
ObjectLocation loc = BooleanVariable make();
Bindings bijectiveBind(loc loc );
在创建绑定的过程中 loc get()结果被传递到loc 的set()方法中 这个不会为Boolean 和 Integer工作的 为了避免这种问题 只要适当的确定参数泛型类型ObjectLocation 目前为止 我们已经看到两个变量是如何被同步的 以下的小节中将看一看Swing组件是如何被绑定的
绑定Swing组件
几乎每个JavaFX Script教程都是由显示一个窗口 按钮或是标签的小程序开始的 JavaFX 使用Swing来构建并显示这些组件 因此 我们可以假设Swing融入了JavaFX运行 不久你将会看到 这个也会应用于绑定
lib/desktop/javafx swing jar文件包含javafx ext swing包 它的类包含了大多数常见的Swing组件 如果你检查它们 你将会注意到它们用$开始显示各区域 它们的类型是ObjectVariable 它可以执行ObjectLocation
图 在Eclipse的Members视图中SwingLabel
考虑到这个接口属于 sun javafx runtime location包 它是安全的假设这样的Locations可以绑定到其他的变量上 以下的程序展示你是如何做到这个的 为了编译并运行这个示例 请添加lib/shared/javafxrt jar lib/desktop/javafx swing jar lib/desktop/Scenario jar 以及 lib/desktop/javafxgui jar到你的类路径上
public class SwingDemo {
public static void main(String args) {
JFrame f = new JFrame();
f setDefaultCloseOperation(JFrame EXIT_ON_CLOSE);
JPanel p = new JPanel(new BorderLayout());
f setContentPane(p);
SwingLabel label = new SwingLabel();
ObjectLocation text =
Bindings makeBijectiveBind(label $text);
p add(label getJComponent() BorderLayout CENTER);
f pack();
f setVisible(true);
text set( Hello JavaFX! );
}
}
除了这个很有用的创建并显示窗口的Swing代码之外 还有三件比较重要的事情要做SwingLabel被实例化并分配到label
Location被分配到test并绑定到label 的$text上
标签被有层次的添加到组件上
请注意你不能直接添加SwingLabel到容器中 相反 它的getJComponent()方法用来获取JComponent实例
虽然这个简单的例子展示了一个Swing组件如何被绑定到一个变量上的 但是却没有说明使用JavaFX 绑定的好处 在我以前的文章 Binding Beans 中 我演示了如何使用JGoodies Binding 和 Beans Binding来执行一个简单的音量控制
VolumeControl示例
音量控制是基于一个简单的特定应用的POJO叫做Volume 它有两个区域 volume 和mute 如图 所示 它通过一个复选框和一个滑块进行操作 标签显示现在的volume值 除此之外 mute控制音量是否调整
图 音量控制示例
涉及Swing组件和POJO区域之间的关系如下
复选框设置mute
滑块设置volume
Mute选择或不选择复选框
Volume设置成滑块的位置
Mute启用或禁用滑块
Volume设置标签文本
完整的来源包含在sources zip中 细节请参考Resources部分 它的结构很像我以前的文章中的版本 所以很容易比较不同的版本 为了编译并运行VolumeControl 请添加lib/shared/javafxrt jar lib/desktop/javafx swing jar lib/desktop/Scenario jar 和lib/desktop/javafxgui jar到你的类路径
首先 所有相关的组件都要初始化 这个发生在initComponents()中 例如 垂直坏块被创建并有如下设置
sliderVolume = new SwingSlider();
sliderVolume $vertical set(true);
在initEventHandling()中建立绑定 例如 复选框与mute链接 用以下命令Bindings bijectiveBind(checkboxMute $selected volume mute); 当复选框被选择的时候禁用滑块是通过添加一个监听者到mute上实现的
volume mute addChangeListener(new ChangeListener() {
@Override
public boolean onChange() {
sliderVolume $enabled set(! volume mute get());
return true;
}
});
每次volume mute 改变的时候 onChange()就会被调用 如果它变成true 滑块就被禁用 如果变成false 滑块就再次使用 这个状态用sliderVolume $enabled set()来设置 相同的方法同样适用于创建标签文本 滑块的值用Integer代表 正如我们早前已经看到的 它不能绑定到Strings上 转换完成如下public boolean onChange() {
labelInfo $text set(volume volume get() toString());
return true;
}
通过使用toString() get()结果变成a String并传递labelInfo $text set()总结
很惊讶的看到JavaFX绑定在Swing应用程序中的使用是如此简单 虽然绑定构架还没有为这个所设计 但是它是一个相当体面的工作 尽管如此 本文还是故意忽视了一些问题
Sun会允许使用并可能重新分配部分JavaFX运行给非JavaFX应用程序吗?
如何安全使用内部类?这里所描述的包还没有被设计成公共的APIS
为什么没有成熟的绑定构架给Swing开发者们使用?
lishixinzhi/Article/program/Java/JSP/201311/19126Java主要应用领域分别是什么
【导语】Java是现在社会社会上比较火的编程语言,一方面是因为语言的自我魅力,另一方面是因为应用领域比较广泛,在嵌入式领域、大数据技术、软件工具、网站应用等方面,丢可以使用,下面就给大家进行Java主要应用领域的具体介绍,一起来看看吧。
1、嵌入式领域
Java在嵌入式领域也有很大的应用。你只需要130KB就能够使用Java技术(在一块小的芯片或者传感器上),这显示了这个平台是多么的可靠。Java最初是为了嵌入式设备而设计的。
事实上,这也是Java最初的一项“立即编写,随处运行”主旨的一部分。
2、大数据技术
Hadoop和其他的大数据技术也在不同程度使用着Java,例如Apache的基于Java的Hbase,Accumulo(开源),以及ElasticSearch。
但是Java并没有占领整个领域,还有其他的大数据技术例如MongoDB就是使用C++编写的.如果Hadoopor和ElasticSearch逐渐发展,那么Java就能有潜力在大数据技术领域上得到更大的发展空间。
3、软件工具
很多有用的软件和开发工具都是运用Java编写和开发的,例如Ecilpse,InetelliJIdea和NetbansIDE.。我认为这些都是最经常使用的用Java编写的桌面应用程序。就如上面所说,Swing曾经在图形用户界面的客户端开发非常流行,它们大多数应用在金融服务领域以及投资银行。虽然现在JavaFx正在逐渐地流行起来,但仍然无法替代Swing,而且C#已经在大部分金融领域中代替了Swing。
4、网站应用
Java同样也在电子商务和网站开发上有着广泛的运用。你可以运用很多RESTfull架构,这些架构是用SpringMVC,Struts2.0和类似的框架开发出来的。
甚至简单的Servlet,JSP和Struts在各种政府项目也是备受欢迎,许多政府,医疗,保险,教育,国防和其他部门的网站都是建立在Java之上的。
5、在金融服务行业的服务器应用
Java在金融服务业有着很大应用。很多的全球性投资银行例如GoldmanSachs(高盛投资公司),Citigroup(花旗集团),Barclays(巴克莱银行),StandardCharted(英国渣打银行)和一些其他银行都用Java编写前台和后台的电子交易系统,结算、信息确认系统,数据处理项目和以及其他的项目。
Java被运用于编写服务端应用,但大多数没有前端,都是从一个服务端(上一级)接受数据,处理数据后发向其他的处理系统(下一级)。
JavaSwing由于能开发出图形用户界面的客户端供交易者使用而备受欢迎,但是现在C#正在取代Swing的市场,这让Swing倍有压力。
6、交易系统
第三方交易系统,金融服务行业的一大部分,同样也是使用Java编写的。例如像Murex这种受欢迎的交易系统,运用于与许多的银行前端链接,同样也是用Java编写的。
7、J2MEApps
虽然IOS和Android的到来几乎扼杀了J2ME的市场,但是仍然有很多的低端诺基亚和三星手机在使用着J2ME。
曾经有段时间大部分的游戏,手机应用都是利用MIDP和CLDC,或者J2ME部分平台编写的,以适用于Android系统。J2ME依然在蓝光、磁卡、机顶盒等产品中流行着。app之所以如此流行是因为对于所有的诺基亚手机,app仍然适用于J2ME。
8、高频交易领域
Java平台已经大大提高了性能特点和JITS,并且Java也拥有像C++级别的传输性能。因此,Java也流行于编写高并发系统。
虽然Java的传输性能不比C++,但你可以不用考虑Java的安全性,可移植性和可维护性等问题(Java内部已经实现好了),而且Java有着更快的运行速度。安全性等问题会使一个没有经验的C++程序员编写的应用程序变得更加缓慢和不可靠。
9、科学应用
现在Java经常是科学应用的默认选择,包括了自然语言处理。这最主要的原因是因为Java比起C++或者其他语言有更加的安全,可移植,可维护,而且Java有着更好的高级并发工具。
10、安卓Apps
如果你想知道Java应用在哪里,你离答案并不远。打开你的安卓手机或者任何的App,它们完全是用有着谷歌AndroidAPI的Java编程语言编写的,这个API和JDK非常相似。前几年安卓刚开始起步而到今日已经很多Java程序员是安卓App的开发者。
关于Java主要应用领域,就给大家介绍到这里了,希望对大家能有所帮助,如果你想进行Java编程学习,那么就需要找专业人士进行学习,一步一个脚印的学好并应用到实践中,祝大家成功!

更多文章:
hover标签属性(a:hover{ color:#00F;}是什么意思,怎么使用)
2026年5月20日 07:45
js select(js 触发select onchange事件代码)
2026年5月19日 04:00
大于等于符号是什么?怎样在键盘上打出大于等于号,小于等于号急用!
2025年10月5日 00:45
用javascript加油优惠价格(现在用什么app加油最便宜)
2025年9月3日 01:45
js split 多个分隔符(js 如何用split()方法按根据“\”(反斜杠)分割字符串)
2026年8月20日 23:30
malloc返回的是什么(用malloc和数组指针申请二维数组返回什么)
2025年8月4日 09:15
mapping file(为什么File mapping比普通文件读写效率高)
2026年4月8日 06:30
translateit翻译成中文(他们正在会议中Translate it into Mandarin,)
2025年12月16日 18:45
stroke width(javascript如何实现把界面上的点,动态的依次连接成一个封闭的图形)
2025年11月9日 19:15
朱子学研究cssci来源集刊(中文社会科学引文索引的学科分类)
2026年5月4日 04:00
plsql删除表中某一条数据(plsqldeveloper删除表需要提交吗)
2026年6月10日 03:30







