JavaFX中的ObservableValue类型

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

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

void addListener(ChangeListener listener) 
void removeListener(ChangeListener listener) 
T getValue() 


OK!这样问题就解决了。

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

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

	class PaneChangeListener implements ChangeListener {
		TitledPane trigger;
		public PaneChangeListener(TitledPane tp){
			this.trigger = tp;
		}
		
		@Override
		public void changed(
				ObservableValue 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() {
                public void changed(ObservableValue ov, Boolean t, Boolean t1) {
                    System.out.println(firstNameProperty().get() + " invited: " + t1);
                }
            });  

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


你可能感兴趣的:(JavaFX)