JavaFX 属性

本文深入探讨JavaFX中的属性概念及其重要性,并详细解析如何利用属性实现数据与用户界面的绑定,展示其在实际应用中的强大功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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);
}
});

  

 

  

 

转载于:https://www.cnblogs.com/LinsenLi/p/6875492.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值