Java 为什么JComboBox忽略空值状态?

Java 为什么JComboBox忽略空值状态?,java,swing,awt,Java,Swing,Awt,我有一个JComboBox和一个defaultcomboxmodel其中的Integers: {null, 1, 2, 3, 4, 5, 6, 7, 8, 9} 假设我在我的JComboBox中有5,我点击JComboBox并选择2,那么下面的程序将显示: 5 -> -> 2 节目如下: import javax.swing.*; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; impor

我有一个
JComboBox
和一个
defaultcomboxmodel
其中的
Integer
s:

{null, 1, 2, 3, 4, 5, 6, 7, 8, 9}
假设我在我的
JComboBox
中有
5
,我点击
JComboBox
并选择
2
,那么下面的程序将显示:

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);
    }
}
这意味着
itemstener
只被调用一次,并且只有
itemsevent.SELECTED
状态。为什么没有使用
ItemEvent调用它。对于
null
(例如,打印
null->
)取消选择
,与数字一样

另一方面,如果我最初在
JComboBox
中有
5
,并且我选择了空值(即
null
),那么我在控制台中看到的就是:

5 ->

那么为什么
JComboBox
忽略
null
值状态呢?似乎什么也没说。

你说的是真的,我能看到的是在
JCombobox
类中的
setSelectedItem
方法:

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;
            }
        }
if(anObject!=null&&!isEditable()){
//对于不可编辑的组合框,选择无效
//将被拒绝。
布尔值=false;
对于(int i=0;i
它不会将
对象设置为select

因此,在
defaultcomboxmodel
实现
setSelectedItem
中,方法传递null,并且它不调用
firecontschanged
事件

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;
            }
        }