让JComboBox在项目选择时更改显示的项目

时间:2013-01-15 17:55:25

标签: java swing jcombobox listeners changelistener

当我展开组合框列表时,我应该看到诸如“一个”“两个”“三个”之类的项目,但当我选择“一个”并折叠组合框时,我希望看到“1”显示而不是“一”。

我尝试在组合框中添加ListDataListener,在contentsChanged()内添加box.getEditor().setItem(my_map.get("one")) contentsChanged()其中my_map存储从“one”到“1”等的映射。

然而,它不起作用,我不知道为什么......调用{{1}}后覆盖我的更改会发生什么?

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

一种方法是不更改内容,但提供适当的渲染器,在绘制过程中检查它是否在弹出窗口内。

enter image description here

概念验证代码段如下所示:

JComboBox box = new JComboBox(new String[] { "One|1", "Two|2", "Three|3" });

box.setRenderer(new ListCellRenderer<String>() {

    private JList<? extends String> list;
    private final JLabel label = new JLabel() {
        @Override
        public void paintComponent(Graphics g) {
            // Check if parent's parent is the combobox or the dropdown
            int part = getParent().getParent() == list ? 0 : 1;
            label.setText(label.getText().split("\\|")[part]);
            super.paintComponent(g);
        }
    };

    @Override
    public Component getListCellRendererComponent(JList<? extends String> list, String value, int index, boolean isSelected, boolean cellHasFocus) {
        this.list = list;
        label.setText(value);
        label.setOpaque(true);
        if (isSelected) {
            label.setForeground(list.getSelectionForeground());
            label.setBackground(list.getSelectionBackground());
        } else {
            label.setForeground(list.getForeground());
            label.setBackground(list.getBackground());
        }
        return label;
    }
});

注意:上面的例子没有正确处理所有方面(例如焦点边框......),但只是提示你如何进一步处理。