zoukankan      html  css  js  c++  java
  • 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就会出现对应的消息提示。

  • 相关阅读:
    【LeetCode】Validate Binary Search Tree
    【LeetCode】Search in Rotated Sorted Array II(转)
    【LeetCode】Search in Rotated Sorted Array
    【LeetCode】Set Matrix Zeroes
    【LeetCode】Sqrt(x) (转载)
    【LeetCode】Integer to Roman
    贪心算法
    【LeetCode】Best Time to Buy and Sell Stock III
    【LeetCode】Best Time to Buy and Sell Stock II
    CentOS 6 上安装 pip、setuptools
  • 原文地址:https://www.cnblogs.com/lngrvr/p/JavaFX_Property_introduce.html
Copyright © 2011-2022 走看看