JavaFX17---属性与绑定

1、什么是属性
     属性是类的可公开访问的特征,影响类的行为、状态或者两者。属性是可以公开访问的,但是它的使用调用了隐藏实际实现的
           方法来访问数据。
     属性是可以观察的,当值发生变化时,相关方会得到通知。
2、属性的种类
     1、简单的属性
     2、索引属性    使用数组数据类型实现
     3、绑定属性   在更改时向所有侦听器发送通知。
     4、约束属性  侦听器可以否决更改的属性
3、什么是绑定
     数据绑定定义了程序中数据元素(通常是变量)之间的关系,以保持它们的同步,在GUI中,经常用于将数据模型中的元素与相应
            的UI元素同步。
     要使绑定正常工作,必须在绑定的依赖项发生更改时通知绑定。支持绑定的编程语言提供了一种向依赖项注册侦听器的机制。当依
           赖项失效或发生更改时,将通知所有侦听器。当绑定收到这样的通知时,它可以与其依赖项同步。
     绑定包括双向绑定和单项绑定,双向绑定中依赖的对象和被绑定的对象的值彼此同步。通常双向绑定定义在两个变量之间。
            单向绑定只在一方进行传递。

 4、绑定支持
      要被监听的属性首先需要在类里声明监听支持对象,PropertyChangeSupport
          然后定义  注册更改通知方法(addPropertyChangeListener() )和注销更改通知方法(removePropertyChangeListener),以供感兴趣的监听器使用。
          使用firePropertyChange()方法将更改通知给已注册的监听器
      监听器首先需要向被监听对象注册,及调用被监听属性对象的addPropertyChangeListener() 方法
           并在收到更改通知时采取必要的操作,handlePropertyChange(propertyChangeEvent e)

5、JavaFX中的属性
     属性可以表示一个值或一个值的集合。
     属性是对象。每种类型的属性都有一个属性类层次结构。例如,IntegerProperty、DoubleProperty和StringProperty类分别
           表示int、double和String类型的属性。这些类是抽象的。它们有两种类型的实现类:一种表示读/写属性,
           另一种表示只读属性的包装器。例如,SimpleDoubleProperty和ReadOnlyDoubleWrapper类是具体的类,
           它们的对象分别用作读/写和只读双属性。
     属性类提供了两对getter和setter方法:get()/set()和getValue()/setValue()。get()和set()方法分别获取和设置属性的值。
     对于基本类型属性例如IntegerProperty, get()方法的返回类型和set()方法的参数类型都是int。getValue()和setValue()方法使用对象类型;
           例如,它们的返回类型和参数类型是IntegerProperty的Integer。
     对于引用类型属性,如StringProperty和ObjectProperty<T>, getter和setter对都使用对象类型。也就是说,StringProperty的get()和
           getValue()方法都返回一个String, set()和setValue()方法接受一个String参数。
     所有的JavaFX属性都是可以观察的。

6、理解属性类层次结构
     只要Property和ObservableValue通过继承相关联,就可以在它们之间创建单向绑定。双向绑定只能在相同类型的两个属性之间创建。
     属性中的 invalidated 事件和 changed 事件
            属性JavaFX 中的属性与基础数据(int,double,boolean 等)一一对应,可以认为是对基础数据进行了包装,相较基础数据,
            属性最大的区别就是属性对 “失效、修改” 等事件可以做出反馈。
    所有读写JavaFX属性都支持绑定
    Property接口新增了五个方法来支持绑定:
          void bind(ObservableValue<? extends T> observable)  //在此属性和指定的ObservableValue之间添加了单向绑定。
          void unbind()     //解除单向绑定
          void bindBidirectional(Property<T> other)     //建立双向绑定
          void unbindBidirectional(Property<T> other)    //解除双向绑定
          boolean isBound()    //判断该属性是否被绑定
    惰性求值:惰性求值(Lazy Evaluation)是一种编程语言的特性,它在需要运算结果时才会进行计算,而不是在定义时就立即计算。
           这种方式可以避免不必要的计算,提高程序的效率。
    急性求值:表达式在它被约束到变量的时候就立即求值,
7、处理属性无效事件
     刚创建一个属性对象时,它是有效的,将属性值更改时会触发一个失效事件,而此时再更改属性值时,将不会触发失效事件,因为此时值
           已经是失效的。当使用get方法读取该值时,它将再次有效,然后再将相同的值赋给该变量也不会触发失效事件,因为该值没有真正改变。
           如果将不同的值赋给该变量时还是会触发失效事件。
8、处理属性更改事件
     使用.addListener();
     属性使用对其值的动态求值来生成更改事件,因为它必须将新值传递给属性更改侦听器。

9、失效事件和更改事件对比
     性能:失效优于更改  
           原因:无效侦听器使惰性计算值成为可能;一行中的多个无效操作只触发一个无效事件。
     一般情况不用读取属性值使用无效监听器反之用更改监听器


10、在JavaFX中使用绑定
       在JavaFX中,绑定是一个求值的表达式。它由一个或多个被称为依赖项的可观察值组成。绑定观察其依赖项的变化,并自动重新计算其值。
       在内部,绑定将失效侦听器添加到它的所有依赖项。当它的任何依赖项无效时,它将自己标记为无效。一个无效的绑定并不意味
              着它的值已经改变。这意味着它需要在下次请求该值时重新计算它的值。

11、单向和双向绑定
       单向绑定:不能直接更改绑定属性的值,它的值必须根据绑定自动计算,在直接更改其值之前,必须解除绑定。
                       只能有一个单项绑定。
      双向绑定:只能在两个类型相同的属性之间进行绑定,可以独立更改,也可以具有多个双向绑定。

12、绑定API
       分为两类:高级绑定API
                       低级绑定API
12.1、高级绑定API
      高级绑定API:由Fluent API和Bindings类组成
      12.1.1 Fluent API
           非流畅API ---------------------->  流畅API
            x.add(y); x.add(z);  ------------->x.add(y).add(z);
       12.1.2  Binding 接口
            •     public void dispose()     //可以删除对其他对象的引用,在内部使用弱失效监听器
            •    public ObservableList<?> getDependencies()    //仅用于调试
            •    public void invalidate()       //使绑定失效
            •    public boolean isValid()       //判断绑定是否有效

            为任何类型的对象创建绑定
                   ObjectExpression+ObjectBinding
        12.1.3、三元表达式
             new When(condition).then(value1).otherwise(value2)
      
12.2、低级绑定API
          三步(1)创建一个拓展其中一个绑定类的类。
              (2)调用父类的bind()方法绑定所有依赖项
              (3)重写超类的computeValue()方法来编写绑定的逻辑。

13、创建一个圆心在画面中央的圆
         将圆心的x坐标与scene的宽度的一半绑定,将y坐标与scene的高度的一半绑定
         将圆的半径大小与宽度的一半和高度的一半较小的那个值绑定


总结
1、Java类可以包含两种类型的成员:字段和方法。字段表示对象的状态,它们被声明为
     私有的。公共方法,称为访问器或getter和setter,用于读取和修改私有字段。对其
     全部或部分私有字段具有公共访问器的Java类称为Java bean,这些访问器定义bean
     的属性。Java bean的属性允许用户自定义其状态、行为或两者兼而有之。
2、JavaFX通过属性和绑定api支持属性、事件和绑定。JavaFX中的属性支持是JavaBeans
     属性的一个巨大飞跃。JavaFX中的所有属性都是可观察的。可以观察它们的失效和值
     的变化。您可以具有读/写或只读属性。所有读/写属性都支持绑定。在JavaFX中,属
     性可以表示一个值或一个值的集合。
3、当属性值的状态第一次从有效变为无效时,属性会生成一个无效事件。JavaFX中的属
     性使用延迟求值。当无效属性再次变为无效时,不会生成无效事件。无效的属性在重新
     计算时变为有效。
4、在JavaFX中,绑定是一个求值的表达式。它由一个或多个被称为依赖项的可观察值组成。
     绑定观察其依赖项的变化,并自动重新计算其值。JavaFX对所有绑定使用延迟求值。
     当绑定最初定义时,或者绑定的依赖项发生变化时,它的值被标记为无效。无效绑定
     的值将在下次请求时计算。JavaFX中的所有属性类都内置了对绑定的支持。
5、绑定有一个方向,即更改传播的方向。JavaFX支持两种属性绑定:单向绑定和双向绑定。
     单向绑定只在一个方向上工作;依赖项的更改会传播到绑定属性,而不是相反。
     双向绑定在两个方向上工作;依赖项的更改反映在属性中,反之亦然。
           
       

  • 19
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaFX是一个用于构建桌面应用的Java库,其中事件处理是用户界面交互的关键部分。对于几何图形计算器这样的应用,我们通常会使用图形用户界面(GUI)元素如按钮、文本框和图形区域来获取用户输入,并通过监听这些元素的事件来执行相应的计算。 在JavaFX中,事件处理涉及到以下几个步骤: 1. **添加事件监听器**:在JavaFX中的`javafx.scene.control`包中,有许多事件接口,如`ActionEvent`, `MouseEvent`等。你可以为按钮或其他图形元素设置事件监听器,如`EventHandler<ActionEvent>`,当用户点击或执行某个动作时,这个监听器会被触发。 2. **处理事件**:在事件监听器的匿名内部类或lambda表达式中,编写处理事件的方法。例如,如果你正在创建一个矩形并需要计算其面积,可以在`onAction`方法中获取用户的输入,如矩形的长和宽,然后计算面积并更新显示结果。 3. **图形绘制**:使用JavaFX的`Scene`和`Shape`类(比如`Rectangle2D`, `Circle`等)来绘制几何图形。图形的事件处理可能与形状的位置、大小或鼠标交互有关。 4. **图形计算器逻辑**:根据用户的选择或操作,动态地改变图形的属性或执行计算。这可能涉及到图形的变换、动画效果或实时反馈。 相关问题-- 1. 如何在JavaFX中为按钮添加点击事件? 2. 如何在图形绘制完成后绑定鼠标事件进行交互? 3. JavaFX中的图形事件如何传递给后台逻辑进行处理?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值