將javafx Property的值保持在特定範圍內的最佳方法是什麼?限制哪些值可以在javafx屬性中解決?
(或 - 這是不好的做法,現有的任何理由從來沒有過濾由JavaFX的屬性包值?)
例1:避免負值在IntegerProperty
例2:保持內IntegerProperty的價值列表的邊界
第一個想法: - 覆蓋IntegerPropertyBase.set(int)
。它是安全的?實際上,setValue(int)
只能調用set(int)
,但是 - 如果此實現有一天發生變化 - 對值集的控制將會丟失。
第二個想法: - 覆蓋IntegerPropertyBase.invalidate()
。但在這一點上,價值已經確定。
將它更適合於JavaFX的屬性拋出IllegalArgumentException
(或ArrayIndexOutOfBoundsException
,如果包裝值是一個數組的索引),或更好的拒絕值超出範圍,設置早在邊界的最後一個值?
也許是這樣的:
class BoundedIntegerProperty extends IntegerPropertyBase {
(...)
int oldValue = defaultValueInBounds;
boolean settingOldValue = false;
public void invalidated() {
if(!settingOldValue){
if(outOfBounds(get())){
settingOldValue = true;
set(oldValue);
} else {
oldValue = get();
}
} else
settingOldValue = false;
}
}
只有扔在無效)的值超出範圍的異常(可保留屬性的值出界。
我是否忽略了提供用於過濾值的javafx屬性中的任何內容?
(如果必要的話,請幫我改善可能英文不好這個文本的...)
在設置屬性之前驗證輸入可能會更簡單,例如驗證文本字段,數據庫結果或來自文件的數據。我看不出任何處理這個問題的好方法,你真的想要任何#set()調用來引發異常嗎? –
你是真的:例如,設置列表的索引而無需訪問此列表是沒有意義的。但是如果我有權訪問列表,索引屬性的setter可能在列表中,並且屬性可能是隻讀的。在列表中,如果索引超出範圍,索引的setter可能會引發異常。 –