JavaFX 属性

首先熟悉两个经常用到的名词

GUI(图形用户界面Graphical User Interface)

API(应用程序编程接口Application Programming Interface)

  是预先定义的函数,直接给你用,而又无需访问源码,或理解内部工作机制和细节。

 

在我们使用FX中的GUI组件,即我们经常用到的Button,TextField当中,属性是贯穿各个控件的这么一个东西。

比如很多个控件都会有它的set,get等方法,我们在使用这些方法的时候,实质上就是在set,get控件当中的属性值。

这里有一个疑问,按照上面这么说不就跟一般面向对象程序设计一样地封装,或者说定义访问,设置变量方法,为什么API要定义为Property?这是因为使用Property就拥有了绑定的功能,这是个看起来很简单,但实际上在数据与用户交互的过程中起了十分巨大的作用:它能绑定GUI到底层的值,实现了数据层与面板层同步的问题。但其实,这么一个绑定是双向的。

我们回过头来谈属性,按照JavaFX中文文档,是这么定义属性变量的(这里定义为amountDue):

 private DoubleProperty amountDue = new SimpleDoubleProperty();

另外,对属性变量定义的方法也有命名规范,大概是setAmountDue:动词小写+变量名头字母大写 拼到一起? 这样的命名规范在使用到TableView的课程设计中被坑过了,那时候没有规范get,set方法名一直错。

最后,最重要的环节,如何实现属性绑定!!!

首先,能实现绑定的要求是个Property变量(或者是定义的一个binding(绑定)变量)? 然后要明白,绑定是个怎样的过程。

先说明observable: 当已注册InvalidationListener()的变量发生改变时触发

bill1.amountDueProperty().addListener(new InvalidationListener() {
   @Override 
  public void invalidated(Observable o) {
    System.out.println("The binding is now invalid." + bill1.getAmountDue());
  }
});
bill1.setAmountDue(200.00);
bill1.setAmountDue(100.00);

可以看到bill1已经注册了InvalidationListener,当下面一个set执行时,即bill1发生改变时,都会执行一次那个重写方法。(那在这个方法里面让其他值等于它是不是就是绑定了呢?)

然后是ObservableValue:是当已注册ChangeListener()的变量发生改变时触发

bill2.amountDueProperty().addListener(new ChangeListener(){
  @Override 
  public void changed(ObservableValue o,Object oldVal,Object newVal){
    System.out.println("Electric bill has changed!"+oldVal+" "+newVal);
  }
}); bill2.setAmountDue(200.00); bill2.setAmountDue(400.00);

一开始我看不懂addListener里面编写的格式是什么鬼,其实里面这样写是可以省下声明的环节(联想一下内部类)其实也可以是这样的传统格式:

myevent try1 = new myevent();
bill2.amountDueProperty().addListener(try1);
bill2.setAmountDue(200.00);
bill2.setAmountDue(400.00);

class myevent implements ChangeListener{
  @Override
  public void changed(ObservableValue o,Object oldVal,Object newVal){
    System.out.println("Electric bill has changed!"+oldVal+" "+newVal);
  }
}

 

实例:通过绑定2个窗口的x,y属性,实现2个窗口的随动,主要部分代码如下

stage.xProperty().addListener(new InvalidationListener() {
  @Override 
  public void invalidated(javafx.beans.Observable o) {
    stage2.setX(stage.getX()+270);
  }
});
stage.yProperty().addListener(new InvalidationListener() {
  @Override 
  public void invalidated(javafx.beans.Observable o) {
    stage2.setY(stage.getY()+120);
}
});

  

 

  

 

posted on 2017-05-18 20:44  植物大戰僵尸  阅读(704)  评论(2编辑  收藏  举报

导航