当前位置: 首页 > 面试题库 >

如何将Map元素用作JComboBox的文本

锺离穆冉
2023-03-14
问题内容

我正在使用addItem()集合的所有元素填充JComboBox(使用)。集合中的每个元素都是一个HashMap(因此,它是一个Hashmaps的ComboBox
..)。

我的问题是-
鉴于我需要将每个项目设置为一个,HashMap如何在GUI的组合框中设置显示的文本?它必须是映射中某个键的值。通常,如果我用自己的类型填充组合框,则将覆盖该toString()方法…但是由于使用Java
HashMap,我不确定如何实现此目的。

有什么想法(如果可能的话,无需实现我自己的HashMap)?

更新
:如果我想要自定义功能,似乎无可避免地将对象集成到JComboBox覆盖toString()上..我希望有一种方法(1)指定要加载到JComboBox中的对象,并且(
2)指定这些对象在GUI中的显示方式。


问题答案:

(2)指定这些对象在GUI中的显示方式。

您可以将任何Object添加到模型,然后创建一个自定义渲染器以任意方式显示该对象。显示toString()方法和自定义渲染器方法的简单示例:

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.plaf.basic.*;

public class ComboBoxItem extends JFrame implements ActionListener
{
    public ComboBoxItem()
    {
        Vector model = new Vector();
        model.addElement( new Item(1, "car" ) );
        model.addElement( new Item(2, "plane" ) );
        model.addElement( new Item(3, "train" ) );
        model.addElement( new Item(4, "boat" ) );

        JComboBox comboBox;

        //  Easiest approach is to just override toString() method
        //  of the Item class

        comboBox = new JComboBox( model );
        comboBox.setDragEnabled(true);
        comboBox.addActionListener( this );
        getContentPane().add(comboBox, BorderLayout.NORTH );

        //  Most flexible approach is to create a custom render
        //  to diplay the Item data

        comboBox = new JComboBox( model );
        comboBox.setDragEnabled(true);
        comboBox.setRenderer( new ItemRenderer() );
        comboBox.addActionListener( this );
        getContentPane().add(comboBox, BorderLayout.SOUTH );
    }

    public void actionPerformed(ActionEvent e)
    {
        JComboBox comboBox = (JComboBox)e.getSource();
        Item item = (Item)comboBox.getSelectedItem();
        System.out.println( item.getId() + " : " + item.getDescription() );
    }

    class ItemRenderer extends BasicComboBoxRenderer
    {
        public Component getListCellRendererComponent(
            JList list, Object value, int index,
            boolean isSelected, boolean cellHasFocus)
        {
            super.getListCellRendererComponent(list, value, index,
                isSelected, cellHasFocus);

            if (value != null)
            {
                Item item = (Item)value;
                setText( item.getDescription().toUpperCase() );
            }

            if (index == -1)
            {
                Item item = (Item)value;
                setText( "" + item.getId() );
            }


            return this;
        }
    }

    class Item
    {
        private int id;
        private String description;

        public Item(int id, String description)
        {
            this.id = id;
            this.description = description;
        }

        public int getId()
        {
            return id;
        }

        public String getDescription()
        {
            return description;
        }

        public String toString()
        {
            return description;
        }
    }

    public static void main(String[] args)
    {
        JFrame frame = new ComboBoxItem();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setVisible( true );
     }

}


 类似资料:
  • 如何跳过中的数组元素? 我的代码: 这将返回:

  • 使用 map元素,可以定义一个图像映射。图像映射是指把一幅图像划分为多个区域(即热点区域),每个热点区域对应一个超级链接,当用户点击热点区域,会自动跳转到预先设定好的链接地址。 创建一个图像映射,需要 img、map、area 三种标签配合完成: 首先,使用 img 元素定义一幅图像,并通过 src 属性定义图像的URL,通过 usemap 属性定义要选择的图像映射名称,以建立图像与图像映射之间的

  • 好。。。我在这里疯了。我已经开始尝试使用 SVG。使用 SVG 并对其应用 CSS 类就像一个魅力。我只是无法弄清楚我做错了什么,但我只是无法让类在svg文本元素上工作。我已经把它一直剥离了,这就是我得到的: 根据http://www.w3.org/TR/SVG/styling.html#ClassAttribute这应该行得通。。。 关于要更改的内容或替代方案的任何提示/提示?

  • 问题内容: 我有一个元素。如何将CSS样式应用于此元素的所有子元素?我只想将样式应用于子元素。不是它的大孩子。 我可以用 这对所有孩子都有效,但我想对所有孩子都适用的解决方案。我以为我可以用,但是 不起作用。 编辑 该选择不使用Firefox 26应用规则,并有根据萤火没有其他规则的保证金。如果我替换为,它会起作用。 问题答案: 这些子元素的后代将(可能)继承分配给那些子元素的大多数样式。 您需要

  • 问题内容: 问题: 更新: 从Java SE 6 API: public JComboBox() 创建带有默认数据模型的JComboBox。默认数据模型是对象的空列表。使用addItem添加项目。 默认情况下,数据模型中的第一项变为选中状态。 因此,我将API更改为JComboBox(model): public JComboBox(ComboBoxModel aModel) 创建一个JCombo

  • 问题内容: 如何将元素列表排序为排序列表。 我使用了许多jComboBox组件,但无法正常工作。如何将此列表按升序排序? 问题答案: 你可以看看。 此模型扩展了DefaultComboBoxModel,并内置了两个附加功能: 创建模型后,将对提供的数据进行排序 在向模型添加新项目时将数据添加到模型,这些项目将被插入以维持排序顺序 默认排序顺序将是添加到模型中的项目的自然排序顺序。但是,您可以通过指