• JavaFX中ObservableValue类型


    刚开始,我发现JavaFX没有onFocusing,或者onFocused之类事件。我在一个窗口里安置了两个TableView,需要对其中获得焦点的进行操作。TableView中与Focuse相关的方法有getFocuseModel,但是得到的TableViewFocusModel与我的需求并无关系。这个问题困扰了我一段时间。

    偶然发现Node的一大堆方法中,有一个不太起眼的focusProperty(),返回ReadOnlyBooleanProperty对象。ReadOnlyBooleanProperty对象实现了多个接口,其中有 ObservableValue。 ObservableValue中定义了三个方法:

    void addListener(ChangeListener<? super T> listener) 
    void removeListener(ChangeListener<? super T> listener) 
    T getValue()

    OK!这样问题就解决了。

        propertyTable.focusedProperty().addListener(new ChangeListener<Boolean>(){
            public void changed(ObservableValue<? extends Boolean> boolVal,
                    Boolean oldVal, Boolean newVal) {
                if (newVal == true)
                    ...;
                }
            } );

    还有照方抓药的地方还有很多。比如Accordion控件,有时候需要知道其中哪个TitledPane是打开的。TitledPane有isExpanded()方法可以判断其状态,但是不够实时。留意一下,TitledPane有个属性——expandedProperty(),问题就简单了:

        class PaneChangeListener implements ChangeListener<Boolean> {
            TitledPane trigger;
            public PaneChangeListener(TitledPane tp){
                this.trigger = tp;
            }
            
            @Override
            public void changed(
                    ObservableValue<? extends Boolean> paramObservableValue,
                        Boolean paramT1, Boolean paramT2) {
                
                final TitledPane cascaded;
                if (trigger.equals(generalPane)) {
                    cascaded = detailPane;
                }
                else {
                    cascaded = generalPane;
                }
                
                new Timer().schedule(new TimerTask(){
                    @Override
                    public void run() {
                        cascaded.setExpanded(!trigger.isExpanded());
                    }                        
                }, 1);            
            }
        }

    上面是我写过的一个类,在一个Accordion控件中,使其中的两个TitlePane总是此开彼合。使用方法如下:

    generalPane.expandedProperty().addListener(new PaneChangeListener(generalPane));
    detailPane.expandedProperty().addListener(new PaneChangeListener(detailPane));

    Ensemble2中的例子,ensemble.samples.controls.table.TableCellFactorySample
    ,内部Entity类Person中的字段,就是Property类型:

        public static class Person {
            private BooleanProperty invited;
            private StringProperty firstName;
        ...
        }

    一般的entity类不需要这么定义。这么定义是为了进一步监听数据改变,比如这个例子有如下代码:

            this.invited.addListener(new ChangeListener<Boolean>() {
                    public void changed(ObservableValue<? extends Boolean> ov, Boolean t, Boolean t1) {
                        System.out.println(firstNameProperty().get() + " invited: " + t1);
                    }
                });  

    运行时,TableView中的Invited字段一有改变,console就会出现对应的消息提示。

  • 相关阅读:
    linux 软件多版本共存
    git new
    centos 7 重新设置分区大小
    yum 多线程插件,apt多线程插件
    配置opencv cmake
    cmake 配置
    OpenCV 静态库 CMAKE 文件
    cron
    开课啦
    pytorch转onnx问题
  • 原文地址:https://www.cnblogs.com/lngrvr/p/JavaFX_Property_introduce.html
Copyright © 2020-2023  润新知