2016-12-26 72 views
2

我有一个JComboBox这些Integer s的DefaultComboBoxModel为什么JComboBox忽略空值状态?

{null, 1, 2, 3, 4, 5, 6, 7, 8, 9} 

说我有5在我JComboBox和我点击JComboBox并选择2,然后在下面的意志dispay程序:

5 -> 
-> 2 

这里是程序:

import javax.swing.*; 
import java.awt.event.ItemEvent; 
import java.awt.event.ItemListener; 

import static java.lang.System.out; 

public class Test { 
    public static void main(String[] args){ 
     final JComboBox<Integer> cb = new JComboBox<>(); 
     cb.setModel(new DefaultComboBoxModel<>(new Integer[]{null, 1, 2, 3, 4, 5, 6, 7, 8, 9})); 
     cb.addItemListener(new ItemListener() { 
      @Override 
      public void itemStateChanged(ItemEvent e) { 
       switch (e.getStateChange()) { 
        case ItemEvent.DESELECTED: 
         out.format("%s ->\n", e.getItem()); 
         break; 
        case ItemEvent.SELECTED: 
         out.format(" -> %s\n", e.getItem()); 
         break; 
       } 
      } 
     }); 

     final JFrame win = new JFrame(); 
     win.setBounds(800,400,30,70); 
     win.add(cb); 
     win.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     win.setVisible(true); 
    } 
} 

什么是我不明白,这就是为什么当值最初null(和它,因为它是模型的数组中的第一个值),输出为

-> 3 

含义ItemListener被调用一次,只有一个ItemEvent.SELECTED状态。为什么与null(例如,打印null ->)不一样,ItemEvent.DESELECTED与数字一样被称为?

它去的其他方式也一样,如果我最初在JComboBox5,我选择了空值(即null),那么我在控制台看到的是:

5 -> 

那么,为什么JComboBox忽略null值状态? the docs似乎没有说任何关于它。

回答

6

你说的是真的,我所看到的是,在JComboboxsetSelectedItem方法:

if (anObject != null && !isEditable()) { 
      // For non editable combo boxes, an invalid selection 
      // will be rejected. 
      boolean found = false; 
      for (int i = 0; i < dataModel.getSize(); i++) { 
       E element = dataModel.getElementAt(i); 
       if (anObject.equals(element)) { 
        found = true; 
        objectToSelect = element; 
        break; 
       } 
      } 
      if (!found) { 
       return; 
      } 
     } 

它不设置objectToSelect

所以在DefaultComboBoxModel执行setSelectedItem方法传递null,它不会调用fireContentsChanged事件。