2014-04-03 65 views
0

組選定項目的原始代碼:JComboBox setSelectedItem錯誤或功能?

public void setSelectedItem(Object anObject) { 
    Object oldSelection = selectedItemReminder; 
    Object objectToSelect = anObject; 
    if (oldSelection == null || !oldSelection.equals(anObject)) { 

     if (anObject != null && !isEditable()) { 
      // For non editable combo boxes, an invalid selection 
      // will be rejected. 
      boolean found = false; 
      for (int i = 0; i < dataModel.getSize(); i++) { 
       E element = dataModel.getElementAt(i); 
       if (anObject.equals(element)) { 
        found = true; 
        objectToSelect = element; 
        break; 
       } 
      } 
      if (!found) { 
       return; 
      } 
     } 
在我看來

if (anObject.equals(element)) { 

應該

if (element.equals(anObject)) { 

考慮一個組合框,顯示如。語言 那麼你甲肝喜歡

class Language { 
    String code; // eg. "en" 
    String name; // eg. "English" 
... 
} 

一類,如果添加語言項目的ComboBox中的toString功能是用來顯示一個項目。在上面的類中,toString函數將返回名稱。呼叫setSelectedItem( 「EN」)失敗,因爲

String.equals(語言)將失敗,因爲Language.toString()將返回 「英語」

倒過來Language.equals(字符串)將幫助因爲類語言可以覆蓋

boolean equals(String comp) { 
    return comp.equals(code) 
} 

只是爲了澄清,我知道如何創建一個組合框與所期望的行爲,我的問題是:是在原代碼的比較中的錯誤還是我錯過的東西根本?

回答

2

的正確實施Object.equals是對稱的,也就是說應該有anObject.equals(element)element.equals(anObject)之間沒有什麼區別。

您描述將組合框模型包含Item類型的對象的情況,但你要選擇通過指定Prop類型,其中的Prop值描述的Item某些屬性的對象選擇一個項目。

使用技術上不正確的equals()方法實現,您可以通過傳遞Prop而不是Item的實例來選擇組合框項目。

與原來的代碼,你將不得不提供Prop類破equals()實施,並與你的修改,你將不得不提供Item類破equals()實現。如果Prop是某個庫類(如您的示例中的String),那麼前一種情況當然是不可能的,我假設您提出的修改的原因是允許後一種情況。

我不知道該庫的創作者試圖通過選擇特定anObject.equals(element)表達阻止程序員實現破equals(),但即使是element.equals(anObject)它仍然是不好的做法到貪圖提供故意不正確equals()實施簡化組合框選擇。

按屬性進行選擇的正確方法是搜索具有所需屬性的項目的組合框數據或創建具有所需屬性的Item的全新實例,然後將該項目傳遞到setSelectedItem

如果你很幸運已經在使用Java 8,那麼從列表中選擇所需的項目是一行代碼,如果沒有,那麼你將不得不用循環編寫一些樣板代碼,但至少你會擁有合適的equals實施和清潔良心。

0

覆蓋繼承的equals方法,你應該通過一個對象作爲參數,而不是字符串

public boolean equals(Object obj){ 
//code goes here 
}