2010-09-23 45 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

相關問題