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就会出现对应的消息提示。

转载于:https://www.cnblogs.com/lngrvr/p/JavaFX_Property_introduce.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值