zoukankan      html  css  js  c++  java
  • 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);
    }
    });
    

      

      

    我好菜呀
  • 相关阅读:
    Java8新特性Function、BiFunction使用
    Java8 stream用法-备忘录
    springboot使用过滤器Filter
    dockerfile命令说明及使用
    RestTemplate对象,进行get和post简单用法
    Jackson动态处理返回字段
    springboot-jjwt HS256加解密(PS:验证就是解密)
    SpringBoot2.1.3修改tomcat参数支持请求特殊符号
    mysql存储过程 带参数 插入 操作
    性能测试如何计算设置并发数
  • 原文地址:https://www.cnblogs.com/LinsenLi/p/6875492.html
Copyright © 2011-2022 走看看