为什么JComboBox忽略空值状态?

时间:2016-12-26 20:52:55

标签: java swing awt

我有一个window.innerHeight widthJComboBox

DefaultComboBoxModel

说我Integer中有{null, 1, 2, 3, 4, 5, 6, 7, 8, 9} 我点击5并选择JComboBox,然后下面的程序会显示:

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

意味着null被调用一次,只有 -> 3 状态。为什么不使用ItemListener ItemEvent.SELECTED来调用(例如打印ItemEvent.DESELECTED),与数字一样?

另一方面,如果我最初在null中有null ->而我选择了空值(即5),那么我在控制台中看到的只有:

JComboBox

那么为什么null忽略5 -> 值状态呢? the docs似乎没有提及任何相关内容。

1 个答案:

答案 0 :(得分:6)

你说的是真的,我在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;
            }
        }

它没有设置objectToSelect

因此,DefaultComboBoxModel实现setSelectedItem方法传递null,并且不会调用fireContentsChanged事件。