文档章节

(转帖)Implementing custom JavaFx Bindings

E
 Ellipse
发布于 2013/12/11 17:02
字数 444
阅读 82
收藏 0

Built in Bindings

Probably you know the JavaFx property binding. ( If not here is a tutorial ). There are several ways to create a binding. The easiest way is to use the  bind  or  bindBidirectional  methods of the property you want to bind. For more complex bindings you can use the  Bindings  class. It provide a lot of special bindings as static methods e.g. ones that calulate number values, concat string properties, bind ObservableLists, ObservableMaps etc., but nothing for  BigDecimal ...

Here we have certain excamples for that:

//Binding with the bind method of a property
StringProperty prop1 = new SimpleStringProperty();
StringProperty prop2 = new SimpleStringProperty();
prop1.bind(prop2);
 
prop2.set("Hello World");
Assert.assertEquals(prop1.get(), prop2.get());
 
 
//Binding with Bindings.add method
IntegerProperty int1 = new SimpleIntegerProperty();
IntegerProperty int2 = new SimpleIntegerProperty();
NumberBinding sum = Bindings.add(int1, int2);
 
int1.set(2);
int2.set(3);
Assert.assertEquals(5, sum.getValue().intValue());

Custom implemented Bindings

If the built in bindings do not fit your needs, JavaFx provides base classes, that you can use for custom implemented bindings. You find them in the package  javafx.beans.bindings  and all their names end with  Binding .

There are only two things to do in your subclass of one of the  Binding  classes:

  • Think about on which other properties your new binding is dependand of. Normally this are the properties you calculate your new value of. Use the bind method to add those properties to the dependencies of the new binding in the initializer block (as done in the examples below) or in the constructor. If the value of one of those changes, the binding value is newly calculated.

  • Implement the computeValue method, which returns the new value of the binding.

Normally you think of numbers to compute a value. But you can do this with every object, that can be created from other values, if you use the ObjectBinding class.  

Here are several examples for that:

//Simple custom IntegerBinding implementation
IntegerProperty intVal = new SimpleIntegerProperty();
IntegerBinding modulo2 = new IntegerBinding() {
    { bind(intVal);}
    protected int computeValue() {
        return intVal.get() % 2;
    }
};
intVal.set(3);
Assert.assertEquals(1, modulo2.get());
intVal.set(4);
Assert.assertEquals(0, modulo2.get());
 
 
//Custom ObjectBinding of BigDecimal with two dependencies
ObjectProperty<BigDecimal> price = new SimpleObjectProperty<>();
ObjectProperty<BigDecimal> amount = new SimpleObjectProperty<>();
ObjectBinding<BigDecimal> totalPrice = new ObjectBinding<BigDecimal>() {
    { bind(price,amount);}
    protected BigDecimal computeValue() {
        if (price.get() == null || amount.get() == null) return null;
        return price.get().multiply(amount.get());
    }
};
 
price.set(new BigDecimal("3.50"));
amount.set(new BigDecimal("2.0"));
Assert.assertEquals(new BigDecimal("7.000"), totalPrice.get());
 
 
//Custom ObjectBinding of Rectangle2D with three dependencies
ObjectProperty<Bounds> boundsInLocalProperty = new SimpleObjectProperty<>();
DoubleProperty widthProperty = new SimpleDoubleProperty();
DoubleProperty heightProperty = new SimpleDoubleProperty();
 
ObjectBinding<Rectangle2D> rectBinding = new ObjectBinding<Rectangle2D>() {
    {bind(boundsInLocalProperty, widthProperty, heightProperty);}
    protected Rectangle2D computeValue() {
        Bounds bounds = boundsInLocalProperty.get();
        return new Rectangle2D(bounds.getMinX(), bounds.getMinY(),
                               widthProperty.get(), heightProperty.get());
    }
};


本文转载自:http://johnthecodingarchitect.blogspot.co.nz/2013/11/implementing-custom-javafx-bindings.html

共有 人打赏支持
E
粉丝 45
博文 65
码字总数 41290
作品 0
大连
程序员
私信 提问
JavaFX还有戏吗?

今年二月份,InfoQ中文曾经报道过社区对于JavaFX发展状态的分析:JavaFX能后来居上吗?这几个月来,JavaFX又发生了什么呢?除了Sun宣布发布JavaFX Mobile之外,就是Jonathan的博客宣布Sun会构...

老枪
2009/05/27
817
0
認識JavaFX

作者:蔡學鏞 注意:本文章內容是依據alpha版技術做描述,讀者閱讀時可能已經和實際現況有所差異。 雖 然Ajax方興未艾,但RIA(Rich Internet/Interface Application)也已經揭開序幕,同樣是...

红薯
2009/02/12
827
2
JavaFX 的开源进程

JavaFX最初由Sun公司在JavaOne 2007大会上推出,以帮助开发者为移动设备、台式机、电视和其他消费电子设备创建内容丰富的应用。最初的产品包括JavaFX移动平台和JavaFX脚本语言。 甲骨文收购S...

oschina
2013/02/17
3.9K
13
JavaFX 2.2 正式发布,下一版本为 8.0

甲骨文今天正式发布了JavaFX 2.2。 该版本中包含了针对Windows、Linux和Mac OS X平台的SDK,不过JavaFX运行时仍然只支持Windows和Linux平台。 该版本的主要新特性包括: 支持H.264和AAC编码的...

Jeky
2012/08/16
2.6K
20
JavaFX 部署 运行出错

刚学JavaFX 跟着教程 一步一步往下做, 到部署的时候 右键bulid.xml文件, Run as ==> Ant build 报错 谁知道可能是什么原因吗? init-fx-tasks: [taskdef] Could not load definitions from re...

那一抹丶白
2016/03/18
1K
4

没有更多内容

加载失败,请刷新页面

加载更多

PHP生成CSV之内部换行

当我们使用PHP将采集到的文件内容保存到csv文件时,往往需要将采集内容进行二次过滤处理才能得到需要的内容。比如网页中的换行符,空格符等等。 对于空格等处理起来都比较简单,这里我们单独...

豆花饭烧土豆
今天
2
0
使用 mjml 生成 thymeleaf 邮件框架模板

发邮件算是系统开发的一个基本需求了,不过搞邮件模板实在是件恶心事,估计搞过的同仁都有体会。 得支持多种客户端 支持响应式 疼彻心扉的 outlook 多数客户端只支持 inline 形式的 css 布局...

郁也风
今天
8
0
让哲学照亮我们的人生——读《医务工作者需要学点哲学》有感2600字

让哲学照亮我们的人生——读《医务工作者需要学点哲学》有感2600字: 作者:孙冬梅;以前读韩国前总统朴槿惠的著作《绝望锻炼了我》时,里面有一句话令我印象深刻,她说“在我最困难的时期,...

原创小博客
今天
4
0
JAVA-四元数类

public class Quaternion { private final double x0, x1, x2, x3; // 四元数构造函数 public Quaternion(double x0, double x1, double x2, double x3) { this.x0 = ......

Pulsar-V
今天
18
0
Xshell利用Xftp传输文件,使用pure-ftpd搭建ftp服务

Xftp传输文件 如果已经通过Xshell登录到服务器,此时可以使用快捷键ctrl+alt+f 打开Xftp并展示Xshell当前的目录,之后直接拖拽传输文件即可。 pure-ftpd搭建ftp服务 pure-ftpd要比vsftp简单,...

野雪球
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部