2011-08-11 9 views
46

Java 7のJComboboxがジェネリックを使用するように更新されました - 私はいつも、それがまだそうしていなかったことを少し監視していると思っていました。JComboBoxのgetSelectedItem()が一般的ではないのはなぜですか?

このようにするJComboBoxを使用しようとしたときしかし、私は方法は、私がなぜ地球上

still just return Object.

にこれらのジェネリック型を使用することが期待されることに気づいたが、このですか?それは私にとって馬鹿なデザインのようだ。 には一般的な getElementAt()メソッドがあるので、代わりにそのメソッドを使用します。しかし、JComboBox自体で変更されている可能性があるように見えるようなラウンドアバウトの方法です。

+2

多分http://forums.oracle.com/forums/thread.jspa?threadID=2266782&tstart=0 Java7 – mKorbel

+0

@mKorbelのための+1おそらく、私は」何かが欠落していますが、スレッドのどの部分がそれを説明していますか? – berry120

+0

(API内)http://download.oracle.com/javase/7/docs/api/javax/swing/JComboBox.html#setSelectedItem%28java.lang.Object%29のJava6とJava7の間の変更は表示されません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()はInteger型のオブジェクトではなく文字列 "foo"を返します。

コンボボックスを編集できない場合は、常に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); 
} 
関連する問題