我有一个类MyModel
与datalogEnabled
(和其他的,但让我们开始),我希望能够正确实现UI /视图绑定。正确地写一个模型,用于视图绑定的属性
public class MyModel {
static final String KEY_DATALOG_ENABLED = "datalogEnabled";
final private PropertyChangeSupport pcs = new PropertyChangeSupport(this);
final private Object syncLock = new Object();
final private Datalogger datalogger = new Datalogger();
public void addPropertyChangeListener(PropertyChangeListener pcl)
{
this.pcs.addPropertyChangeListener(pcl);
}
public void removePropertyChangeListener(PropertyChangeListener pcl)
{
this.pcs.removePropertyChangeListener(pcl);
}
public boolean isDatalogEnabled()
{
synchronized (this.syncLock)
{
return this.datalogEnabled;
}
}
public void setDatalogEnabled(final boolean enable) {
boolean old;
synchronized (this.syncLock) {
old = this.datalogEnabled;
this.datalogEnabled=enable;
}
/* begin snippet X: this is wrong for threading reasons */
this.pcs.firePropertyChange(KEY_DATALOG_ENABLED, old, enable);
setDatalogEnabledNow(enable);
/* end snippet X */
}
setDatalogEnabledNow(boolean b)
{
this.datalogger.setEnable(b);
}
/* other methods */
}
public class Datalogger() {
public void setEnable(boolean enable) { ... }
}
除了片断X,这似乎权,但我不知道。我得到的是,访问/设置/监听属性的各种方式可能发生在不同的线程上,我需要做的是在我的Datalogger类的某处(做一些文件I/O)处理datalogEnabled
属性,在除Swing UI线程之外的另一个线程上,因为我不希望UI线程无响应。
我该如何正确重写片段X?
在我的整个程序中,我有一个ExecutorService
的实例。我可以添加一个Executor
(的ExecutorService
超)作为MyModel
类的构造函数的参数,并为片段X做到这一点:
this.pcs.firePropertyChange(KEY_DATALOG_ENABLED, old, enable);
this.executor.execute(new Runnable() {
@Override public void run() { setDatalogEnabledNow(enable); }
});
我应该把firePropertyChange
呼叫到递延Runnable任务呢? (是firePropertyChange应该立即调用还是在属性更改生效之后)
或者Datalogger类是否也有Executor
以及它可以协调各种任务?
我很困惑在这一个....
所以你的意思是'MyModel'应该只是一个空白状态模型,我的Datalogger应该也是一个监听器? – 2010-09-23 16:11:30
是的。在我看来,Datalogger应该在MyModel中监听属性“datalogEnabled”,并且所有线程micmac都应该位于Datalogger中的propertyChange方法中。 – Istao 2010-09-23 21:55:16