Java 7のJComboboxは、ジェネリックを使用するように更新されました-まだ行っていないのは少し見落としだといつも思っていたので、この変更を見てうれしく思いました。
ただし、この方法でJComboboxを使用しようとすると、これらの汎用型を使用することを期待していたメソッドに気付きました それでも_Object.
_ を返すだけです。
一体なぜこれなのか?私にはばかげた設計上の決定のように思えます。基礎となる ListModel には汎用のgetElementAt()
メソッドがあるので、代わりにそれを使用します-しかし、変更された可能性があるように見える何かを行うためのちょっとした回り道ですJComboBox自体に。
getSelectedItem()
を参照していると思いますか?
その理由は、コンボボックスが編集可能である場合、選択されたアイテムは必ずしもバッキングモデルに含まれているとは限らず、汎用タイプに制限されていないためです。例えば。モデル[1、2、3]で編集可能な_JComboBox<Integer>
_がある場合でも、コンポーネントに「foo」と入力すると、getSelectedItem()
はオブジェクトではなく文字列「foo」を返します。タイプ整数の。
コンボボックスが編集できない場合は、いつでもcb.getItemAt(cb.getSelectedIndex())
を延期して、型の安全性を実現できます。何も選択されていない場合、これはnull
を返します。これは、getSelectedItem()
と同じ動作です。
タイプセーフバージョンは次のとおりです。
public static <T> T getSelectedItem(JComboBox<T> comboBox)
{
int index = comboBox.getSelectedIndex();
return comboBox.getItemAt(index);
}