public class Test8 extends JFrame implements KeyListener{
    
    JComboBox jcb; 
    
    public static void main(String...args){
        new Test8();
    }
    public Test8(){
        jcb = new JComboBox();
        jcb.addItem("AB");
        jcb.addItem("CD");
        jcb.addItem("EF");
        jcb.addItem("AB");
        jcb.addItem("CD");
        
        jcb.addKeyListener(this);
        this.getContentPane().add(jcb);
        this.pack();
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    @Override
    public void keyPressed(KeyEvent e) {
//        System.out.println(jcb.getSelectedIndex());
    }
    @Override
    public void keyReleased(KeyEvent e) {
        System.out.println(jcb.getSelectedIndex());
    }
    @Override
    public void keyTyped(KeyEvent e) {
//        System.out.println(jcb.getSelectedIndex());
    }
}用滑鼠可以選擇,但用方向鍵就選擇不了了, 而且如果要通過itemStateChanged來判斷getSelectedIndex的話得到的是最先出現的索引值:即你選后一個AB,getSelectedIndex返回的卻是0。
既然這樣的話那JComboBox為什麽還允許接受重複數據呢?直接把用戶數據轉成Set不更好嗎?

解决方案 »

  1.   

    JComboBox的addItem method的說明。
    public void addItem(Object anObject)    Adds an item to the item list. This method works only if the JComboBox uses a mutable data model.    Warning: Focus and keyboard navigation problems may arise if you add duplicate String objects. A workaround is to add new objects instead of String objects and make sure that the toString() method is defined. For example:       comboBox.addItem(makeObj("Item 1"));
           comboBox.addItem(makeObj("Item 1"));
           ...
           private Object makeObj(final String item)  {
             return new Object() { public String toString() { return item; } };
           }把你的成式改成這樣,你再試試看。public class Test8 extends JFrame implements KeyListener {    JComboBox jcb;    public static void main(String... args) {
            new Test8();
        }    public Test8() {
            jcb = new JComboBox();
            jcb.addItem(new TestObj(1));
            jcb.addItem(new TestObj(2));
            jcb.addItem(new TestObj(3));
            jcb.addItem(new TestObj(4));
            jcb.addItem(new TestObj(5));
            jcb.addKeyListener(this);
            this.getContentPane().add(jcb);
            this.pack();
            this.setVisible(true);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }    @Override
        public void keyPressed(KeyEvent e) {
            // System.out.println(jcb.getSelectedIndex());
        }    @Override
        public void keyReleased(KeyEvent e) {
            System.out.println(jcb.getSelectedIndex());
        }    @Override
        public void keyTyped(KeyEvent e) {
            // System.out.println(jcb.getSelectedIndex());
        }
        class TestObj{
            private int id;
            public TestObj(int i){
                id=i;
            }
            public String toString(){
                return "AB";
            }        @Override
            public boolean equals(Object obj) {
                if (obj == null) {
                    return false;
                }
                if (getClass() != obj.getClass()) {
                    return false;
                }
                final TestObj other = (TestObj) obj;
                if (this.id != other.id) {
                    return false;
                }
                return true;
            }        @Override
            public int hashCode() {
                int hash = 5;
                hash = 37 * hash + this.id;
                return hash;
            }
        }
    }