2010-09-23 57 views
0

我有一个类MyModeldatalogEnabled(和其他的,但让我们开始),我希望能够正确实现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以及它可以协调各种任务?

我很困惑在这一个....

回答

1

模型的听众可以UIS组件或域组件。如果一个监听器是一个UI组件,它必须在edt上运行,而不是在监听器是域的情况下运行。

该事件来自ui组件或来自域组件。如果事件来自ui组件,则fire方法在edt上,而事件不是来自域。

所以这有点复杂......我的观点是每个听众都应该为自己工作:如果不是的话,ui听众会发现edt,如果不是,那么域名就不会。所以火法留在原来的线程上。

2 cts。

+0

所以你的意思是'MyModel'应该只是一个空白状态模型,我的Datalogger应该也是一个监听器? – 2010-09-23 16:11:30

+0

是的。在我看来,Datalogger应该在MyModel中监听属性“datalogEnabled”,并且所有线程micmac都应该位于Datalogger中的propertyChange方法中。 – Istao 2010-09-23 21:55:16

相关问题