2011-01-21 28 views
4

以下のコードにはバグがあります。 JFrameの読み込み時にTabキーを押してJComboBoxにフォーカスし、下キーを押してみます。それは何もしません。JComboBoxのヌルIn矢印キーの使用

位置0にNULLを挿入するとこれが発生します。しかし、私はまだNullを選択できるようにしたいと思います。私はユーザーにオプションを選択させたくありません。

package kobalt.test.colin; 

import java.awt.*; 
import javax.swing.*; 

public class ColinTest extends JFrame { 

    private JTextField mTextField; 
    private JComboBox mComboBox; 

    public ColinTest(){ 
     setLayout(new BorderLayout()); 

     mTextField = new JTextField("Something"); 
     mComboBox = new JComboBox(new String[]{"One", "Two"}); 
     mComboBox.insertItemAt(null, 0); //this line causes the bug 

     add(mTextField, "North"); 
     add(mComboBox, "South"); 

     pack(); 
     setVisible(true); 
    } 


    public static void main(String[] argv) { 
     new ColinTest(); 
    } 
} 

この動作を修正するためにJComboBoxでオーバーライドできるものはありますか?

空の文字列を0桁目に挿入するのはあまり面白くありません。どこでもそれを処理する必要があります。

Wrappingオブジェクトを使用することもできますが、JComboBoxで何かを拡張してオーバーライドしたいと思います。

答えて

2

Nullオブジェクトは、JComboBoxでうまく再生されません。たとえば、アイテムを選択すると発生するコンボボックスのgetSelectedIndexメソッドは、オブジェクトがnullの場合は-1を返します。また、ヌルチェックを実行し、誤った結果を返す可能性のある他の方法もあります。

ただし、オブジェクトがnullの場合は-1の代わりに0を返すように、getSelectedIndexをオーバーライドしてみてください。また、ヌルをチェックしないようにselectedItemChangedをオーバーライドします。以下は、動作しているようですが、あまりにもオーバーライドする必要がある他の方法があるかもしれません。

JComboBox mComboBox = new JComboBox(new String[]{"One", "Two"}){ 
    @Override 
    public int getSelectedIndex() { 
     Object sObject = dataModel.getSelectedItem(); 
     int i,c; 
     Object obj; 

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

      if (obj != null && obj.equals(sObject)) 
       return i; 
     } 
     return -1; 
    } 

    @Override 
    protected void selectedItemChanged() { 
     fireItemStateChanged(new ItemEvent(this, ItemEvent.ITEM_STATE_CHANGED, 
       selectedItemReminder, 
       ItemEvent.DESELECTED)); 
     selectedItemReminder = dataModel.getSelectedItem(); 

     fireItemStateChanged(new ItemEvent(this, ItemEvent.ITEM_STATE_CHANGED, 
       selectedItemReminder, 
       ItemEvent.SELECTED)); 
    } 
}; 

しかし、代わりに上記を行うので、私はラッパーオブジェクトを使用することをお勧めします。例:

class StringWrapper{ 
    final String s; 
    public StringWrapper(String s){ 
     this.s=s; 
    } 
    @Override 
    public String toString() { 
     return s; 
    } 
} 

JComboBox cb = new JComboBox(new StringWrapper[]{ 
      new StringWrapper("one"), 
      new StringWrapper("two"), 
      new StringWrapper("three")}); 
cb.insertItemAt(new StringWrapper(null), 0); 
+0

私はラッパーオブジェクトに行って、ありがとう。私は文のファンではありませんでした "他にも優先される必要のある方法があるかもしれません" – colinjwebb

1

このようにしてコンボボックスを作成すると、Vectorに基づいたDefaultComboBoxModelが作成されます。したがって、NULLは挿入できません。 nullsをサポートするComboBoxModelを実装しようとすることができます。

+0

-1これは間違っています。モデルにヌルを挿入できます。要素がnullの場合は、動作が異なるコンボボックスです。 – dogbane

関連する問題