JCombobox根据值显示文本

时间:2016-07-13 13:02:37

标签: java swing jcombobox

我有一个充满了一些物品的组合框。每个项目都有显示成员和值成员:

    Vector model = new Vector();
    model.addElement(new FilterValue("10000 Hz", 0));
    model.addElement(new FilterValue("5000 Hz", 1));
    model.addElement(new FilterValue("1000 Hz", 5));
    model.addElement(new FilterValue("100 Hz", 50));
    model.addElement(new FilterValue("10 Hz", 500));
    model.addElement(new FilterValue("1 Hz", 5000));

public class FilterValue {
    private final String label;
    private final int value;

    public FilterValue(String label, int value) {
        this.label = label;
        this.value = value;
    }

    public String getLabel() {
        return label;
    }

    public int getValue() {
        return value;
    }

    public String toString()
    {
        return label;
    }
}

JComboBox的初始化

    cbFilter1 = new JComboBox(model);       
    cbFilter1.setBounds(176, 70, 90, 20);       
    cbFilter1.setSelectedIndex(-1);
    pnlOUT1.add(cbFilter1);

    cbFilter1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            JComboBox comboBox = (JComboBox)e.getSource();
            FilterValue item = (FilterValue)comboBox.getSelectedItem();
            System.out.println( item.getValue() + " : " + item.getLabel() );
        }
    });

当我选择例如5000 Hz时,显示文本为5000 Hz,值为1。

问题是如何设置示例5的值并显示1000 Hz?

我试过

cbFilter1.setSelectedItem(5);

但没有效果。

4 个答案:

答案 0 :(得分:0)

因此,您基本上希望按照其值或标签选择项目。

我能想到的第一个(也是最简单的)事情就是用FilterValue作为值创建一个Map对象。使用此映射,您只需在ComboBox上使用setSelectedItem

首先复制Vector中的元素:

Map<Integer, FilterValue> valueMap = new HashMap<>();
Map<String, FilterValue> labelMap = new HashMap<>();
model.forEach(filter -> {
  valueMap.put(filter.getValue(), filter);
  labelMap.put(filter.getLabel(), filter);
});

然后你可以做这样的事情

String label = "5000 Hz";
cbFilter1.setSelectedItem(labelMap.get(label));

或者

int value = 5;
cbFilter1.setSelectedItem(valueMap.get(value));

然后您可以选择如何收集FilterValue的值(或标签)(可能是JTextField或其他)

答案 1 :(得分:0)

更改您选择的项目:

  cbFilter1 = new JComboBox(model);       
    cbFilter1.setBounds(176, 70, 90, 20);       
    cbFilter1.setSelectedIndex(5); // EDITED
    pnlOUT1.add(cbFilter1);
cbFilter1.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        JComboBox comboBox = (JComboBox)e.getSource();
        FilterValue item = (FilterValue)comboBox.getSelectedItem();
        System.out.println( item.getValue() + " : " + item.getLabel() );
    }
});

答案 2 :(得分:0)

您希望通过传递现有值或标签来选择行吗?

方法setSeletedIndex(int index)需要一个与行号相对应的int(此处为0到5)。

您可以使用方法setSelectedItem(Object obj)来选择想要的FilterValue对象。

这是一个简单的方法,可帮助您从给定值中选择正确的FilterValue对象:

/* Could do the same for label, using val.getLabel()
 * and passing a String in parameter
 */
public void selectByValue(int value){
    FilterValue row = null;
    for(FilterValue val : model){ //Searching for the corresponding FilterValue
        if(val.getValue() == value){
            row = val;
        }
    }
    cbFilter1.setSelectedItem(row); //Select the corresponding row
}

当像这样调用这个方法时

this.selectByValue(5);

它将在Vector中搜索具有值&#34; 5&#34;的FilterValue。并选择此对象的行。这要求您没有任何值两次,否则它会选择出现的第一个值。

经过测试和工作;)

希望它有所帮助!

答案 3 :(得分:0)

感谢所有人,我找到了一个在我的情况下运行良好的解决方案:

public static void setSelectedValue(JComboBox comboBox, int value)
{
    FilterValue item;
    for (int i = 0; i < comboBox.getItemCount(); i++)
    {
        item = (FilterValue)comboBox.getItemAt(i);
        if (item.getValue() == value)
        {
            comboBox.setSelectedIndex(i);
            break;
        }
    }
}