【问题标题】:Let JComboBox change displayed item upon item selection让 JComboBox 在项目选择时更改显示的项目
【发布时间】:2013-01-15 17:55:25
【问题描述】:

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

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

但是,它不起作用,我不知道为什么.. 在调用 contentsChanged() 之后会发生覆盖我的更改的事情吗?

有什么想法吗?

【问题讨论】:

  • 能贴一下这个问题相关的代码吗?

标签: java swing jcombobox listeners changelistener


【解决方案1】:

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

概念验证代码 sn-p 如下所示:

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

注意:上面的示例并未正确处理所有方面(例如焦点边框...),而只是提示您如何进一步进行。

【讨论】:

  • 谢谢霍华德。看起来它会成功的。早些时候,我通过调用box.setSelectedItem() 而不是box.getEditor().setItem() 使其工作。我必须在逻辑上做一些事情来抑制contentsChanged(),因为box.setSelectedItem() 触发了它的另一个调用。
猜你喜欢
  • 1970-01-01
  • 2015-09-26
  • 2011-10-08
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多