我有一个充满了一些物品的组合框。每个项目都有显示成员和值成员:
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);
但没有效果。
答案 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;
}
}
}