2017-07-07 14 views
1

私はJComboBoxを持っています。私はJComboBoxに文字列を渡しています。値の一部は、その配列内で複数回あります。コンボボックスは正しく表示されますが、すべての項目を選択することはできません。この例ではJComboBox同じエントリ複数回

String[] entrys = {"A", "B", "C", "A"}; 
JComboBox combo = new JComboBox(entrys); 

A以前のアレイにすでに存在するため、私はA秒を選択することができません。私は二Aを押すと

combo.addItemListener(new ItemListener() { 
    @Override 
    public void itemStateChanged(ItemEvent e) { 
     if(e.getStateChange() == ItemEvent.SELECTED) 
      System.out.println(combo.getSelectedIndex()); 
    } 
}); 

それはまだ最初の一つを選択し、0を印刷しています。

  • これを機能させるには、どのような方法が最適ですか?
  • カスタムコンボボックスモデルを作成する必要がありますか?
+0

なぜあなたのエントリに2番目の「A」がありますか? – hamena314

+0

私はUIのためだけにそれを必要とし、説明するのに時間がかかりすぎます。それはファイル名(完全なパスではない)である可能性があり、それを選択すると、画像の場合はプレビューが表示されます。 – Galveston01

答えて

1

ので、基本的には、JComboBoxは... getSelectedIndex方法でこれをやっている

public int getSelectedIndex() { 
    Object sObject = dataModel.getSelectedItem(); 
    int i,c; 
    E obj; 

    for (i=0,c=dataModel.getSize();i<c;i++) { 
     obj = dataModel.getElementAt(i); 
     if (obj != null && obj.equals(sObject)) 
      return i; 
    } 
    return -1; 

あなたがAを選択すると、それは0を返している理由、それは選択された値と一致するオブジェクトが見つかったので、これは、あります位置0。あなたは

...そして、私たちは String値をマッピングする必要が

public class Wrapper { 
    private final String value; 

    public Wrapper(String value) { 
     this.value = value; 
    } 

    public String getValue() { 
     return value; 
    } 

    // I personally prefer to use a custom cell renderer, but 
    // for the sake of brevity, I'm using the toString method instead 
    @Override 
    public String toString() { 
     return value; 
    } 

} 

...たぶん

比較が正しい値を選択することができるようになる値を中心にユニークなオブジェクトラッパーを生成するようなものを必要とします
String[] entrys = {"A", "B", "C", "A"}; 
Wrapper[] wrappers = Arrays.stream(entrys).map((String t) -> new Wrapper(t)).toArray(Wrapper[]::new); 
JComboBox<Wrapper> b = new JComboBox<>(wrappers); 

と設定されています。 ではなくを使用しているので、それらをアンラップする必要があります。

+0

ありがとう!私はすでにラッパーとして使用できるクラスを使用しています(コードを単純にするために投稿していません)。しかし、カスタムセルレンダラーの可能性については知らなかったので、このクラスを上書きすることはできませんtoStringメソッド。私は、カスタムセルレンダラーについて、自分自身にそのように試してみることを考えていると思います。 – Galveston01

関連する問題