我有一個類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