回答
聽起來就像你想在一個類中包裝一個布爾值,你可以監聽它的變化。
class ObservableBoolean {
// "CopyOnWrite" to avoid concurrent modification exceptions in loop below.
private final List<ChangeListener> listeners =
new CopyOnWriteArrayList<ChangeListener>();
private boolean value;
public boolean getValue() {
return value;
}
public synchronized void setValue(boolean b) {
value = b;
for (ChangeListener cl : listeners)
cl.stateChanged(new ChangeEvent(this));
}
public synchronized void addChangeListener(ChangeListener cl) {
listeners.add(cl);
}
public synchronized void removeChangeListener(ChangeListener cl) {
listeners.remove(cl);
}
}
後來乾脆:
ObservableBoolean b = new ObservableBoolean();
//...
// Start the "period of time":
b.addChangeListener(iWantToBeNotifiedOfChanges);
// ...
// End the "period of time":
b.removeChangeListener(iWantToBeNotifiedOfChanges);
這實際上是MVC模式(和觀察者模式)的簡單情況。這種情況下的模型是ObservableBoolean,並且視圖將是想要被通知更改的「視圖」。
你也可以,如果你想避免一個奇怪的看着javax.swing...
進口
使用Timer
或寫自己的類擴展Thread
寫自己的ChangeListener
接口。
Google上搜尋這些東西應該給你良好的開端
編輯:從問題也不太清楚什麼是他的打算。也許他想要在確切的時間段內引用某種方法,而不是在事件後立即引用。對於這種模式,我寧願堅持計時器,或寫我自己的線程。編寫自己的線程仍然是解釋特定用戶需求的最佳方式。另一方面,如果這真的是偵聽事件的情況,我的Timer模式將完全錯誤。
示例:如果用戶請求(請求= true),我想每5分鐘更新一次數據庫(想象Web瀏覽器遊戲)。有了錯誤的請求,我不需要更新數據庫。立即更新數據庫(遊戲部落戰爭中的玩家數量統計)完全是矯枉過正。
從true - > false - > true的快速變化會被忽視,除非你在某些「check-if-changed-since-last-pall」類中封裝了布爾值。 – aioobe 2010-04-30 10:41:47
是真實的,但問題不是立即檢查,而是在一定的時間(時間段)內檢查。 這取決於模型設計。 擴展線程類基本上是監聽器的實現(不是字面上,但幾乎相同) – Xorty 2010-04-30 10:50:22
「如果在該時間段內發生更改,則執行一個方法」。我在說,如果在這段時間內進行了兩次*更改,那麼您*需要一個額外的布爾型'stateHasChanged'來跟蹤這個(否則這種改變很可能未被注意到)。 – aioobe 2010-04-30 11:13:50
看起來像你應該看看實施某種Model View Controller Pattern
。 看看here
基本的想法是,當布爾值被改變時,你應該觸發一個事件,然後該事件被觸發,你的監聽器應該處理該事件。
艾姆,爲什麼投票呢? – 2010-04-30 16:47:29
做,這是一個包裝類最簡單的方法...
public class Bool
{
public Bool(){ _val = false; }
public Bool(boolean val) { _val = val; }
public boolean getValue(){ return _val; }
public void setValue(boolean val){
_changesupport.firePropertyChange("value",_val,_val=val);
}
public void addPropertyChangeListener(PropertyChangeListener listener){
_changesupport.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener){
_changesupport.removePropertyChangeListener(listener);
}
private boolean _val = false;
private final PropertyChangeSupport _changesupport = new PropertyChangeSupport(this);
}
這是擺一個共同的模式,並且可以使用PropertyChangeSupport簡化上,你可以觀察對象的創建和傾聽財產變化。通過這樣的課程,您可以註冊PropertyChangeListener來處理由此產生的結果PropertyChangeEvent。
與'PropertyChangeSupport'很好。它爲什麼不位於更「通用」的包中?用於PropertyChangeSupport的 – aioobe 2010-04-30 10:58:37
+1。雖然我只是把它作爲final和public並跳過Bool類的add和remove方法。 – 2010-04-30 12:48:29
- 1. Java不斷檢查日期
- 2. 如何不斷檢查android中的文本更改事件?
- 3. 不斷在Java中檢查時間
- 4. 不斷檢查共享內存在循環中更改
- 5. 不斷檢查網絡更新 - 如何?
- 6. 如何讓JavaScript不斷檢查更新?
- 7. C#:定期檢查文件夾中的更改嗎?
- 8. 檢查登錄的截斷/更改權限
- 9. GIT中的不間斷更改
- 10. 在Java 7中Java版本檢查退出代碼已更改Java 7中?
- 11. 檢查java中的零循環線程中的中斷
- 12. Java檢查的異常不在函數的throw規範中嗎?
- 13. Eclipse不斷更改佈局
- 14. 如何不斷更改iframe?
- 15. Maven:檢查scm中的更改
- 16. 檢查MongoDB中的模型更改,SailsJS
- 17. 檢查ASP.net表單中的更改
- 18. 檢查值更改或不在datetimepicker
- 19. 檢查布爾是否已經在Java中更改
- 20. 如何檢測CI構建中的WCF中斷更改
- 21. Visual Studio 2010,TFS不斷檢查出解決方案文件正在更改'VWDPort'
- 22. Django正在檢查更改的參數嗎?
- 23. 檢測Java中的HTTP中斷
- 24. Java如何檢查更新?
- 25. 更改TD顏色檢查
- 26. 更改值時檢查
- 27. .ASPX已更改檢查
- 28. Jquery類檢查和更改
- 29. 檢查IList是否更改?
- 30. Angular2 HostListener檢查URL更改
+1對於觀察者模式。我想知道是否要監視布爾本身,或者如果您應該讓更改狀態的類擁有偵聽器列表,並在布爾上執行mod時觸發更改事件。 – akf 2010-04-30 10:50:33
@aioobe - >現在看我的編輯 – Xorty 2010-04-30 11:01:09
+1 ...但有幾點:偵聽器列表應該可能是最終的,getValue()不會同步,如果偵聽器在通知時嘗試將自己作爲偵聽器移除,將導致到ConcurrentModificationException。您可以通過使用CopyOnWriteArrayList而不是ArrayList來解決這個最終問題。 – Adamski 2010-04-30 11:02:49