2011-08-11 24 views
46

Java 7中的JCombobox已更新爲使用泛型 - 我一直認爲這是一個疏忽,它還沒有,所以我很高興看到這種變化。爲什麼JComboBox不是通用的getSelectedItem()?

然而,試圖以這種方式使用的JComboBox時,我意識到,我的方法預計使用這些泛型類型still just return Object.

到底是什麼原因呢?這對我來說似乎是一個愚蠢的設計決定。我意識到底層ListModel有一個通用的getElementAt()方法,所以我將使用它 - 但它有點迂迴的做一些看起來像JComboBox本身可能已被更改的東西。

+2

也許http://forums.oracle.com/forums/thread.jspa?threadID=2266782&tstart=0 +1 Java7 – mKorbel

+0

@mKorbel也許我我錯過了一些東西,但是線程的哪一部分解釋了它? – berry120

+0

在API中我無法看到Java6和Java7之間的更改,該http://download.oracle.com/javase/7/docs/api/javax/swing/JComboBox.html#setSelectedItem%28java.lang.Object%29 ,也不是http://download.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode%28%29 – mKorbel

回答

55

我想你是指getSelectedItem()

原因是,如果組合框是可編輯的,則選定項目不一定包含在支持模型中,並且不受限於通用類型。例如。如果模型[1,2,3]上有可編輯的JComboBox<Integer>,仍然可以在組件中鍵入「foo」,getSelectedItem()將返回String「foo」而不是Integer類型的對象。

如果組合框不可編輯,則始終可以按照cb.getItemAt(cb.getSelectedIndex())來實現類型安全。如果沒有選擇,則返回null,這與getSelectedItem()的行爲相同。

+0

啊,這很有道理 - 在記憶失誤後我忘了關於JComboBoxes的可編輯端。最有可能的原因是它們都不能在我的應用程序中編輯!你描述的方法就是我一直在使用的方法 - 它看起來像是一個迂迴的做法,但現在我明白了爲什麼。 – berry120

+0

您無需確定選擇了某個項目。如果'getItemAt'被賦予一個無效值(例如-1),則返回'null'。如果沒有選擇任何東西,則這與'getSelectedItem()'行爲相同。 –

+0

@DuncanJones:你說得對。如果不檢查,我認爲getItemAt會拋出一個IllegalArgumentException,IndexArrayOutOfBoundsException或類似的東西,如果調用一個無效的索引。 – jarnbjo

0

這裏是一個類型安全的版本:

public static <T> T getSelectedItem(JComboBox<T> comboBox) 
{ 
    int index = comboBox.getSelectedIndex(); 
    return comboBox.getItemAt(index); 
} 
相關問題