2016-07-13 5 views
0

У меня есть combobox, который заполнен некоторыми элементами. Каждый элемент имеет элемент отображения и элемент значения:Текст сообщения 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 Гц, текстовый дисплей составляет 5000 Гц, а значение равно 1.

вопрос в том, как установить значение, например, 5 и отобразить 1000 Гц?

Я попытался с

cbFilter1.setSelectedItem(5); 

Но нет никакого эффекта.

+0

Так должен это сказать 1000HZ или 5? Вы противоречите себе. Просто нужны точные значения – basic

+0

Этого можно достичь, создав метод, который выполняет итерацию членов 'FilterValue' комбо, отбрасывает их обратно в' FilterValue' и проверяет атрибут 'value'. –

+0

'cbFilter1.setBounds (176, 70, 90, 20); «Java GUI должны работать с разными ОС, размером экрана, разрешением экрана и т. Д., Используя разные PLAF в разных локалях. Таким образом, они не способствуют идеальной компоновке пикселей. Вместо этого используйте диспетчеры макетов или [их комбинации] (http://stackoverflow.com/a/5630271/418556), а также макет и границы для [пробела] (http://stackoverflow.com/a/17874718/ 418556). –

ответ

0

Таким образом, вы в основном хотите выбрать элементы по их значению или по их метке.

Первой (и самой простой) вещью, которую я мог бы придумать для этого, является создание объекта Map с параметром FilterValue как значения. С помощью этого сопоставления вы можете просто использовать setSelectedItem на ComboBox.

Сначала скопируйте элементы из вашего вектора:

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 или что-то еще)

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

Он будет искать для FilterValue в вашем Вектор, который имеет значение «5» и выбирает строку этого объекта. Это предполагает, что у вас нет значений в два раза или он выберет первый, который появится.

Испытан и работал;)

Надеется, что это помогло!

+0

Я получаю ошибку, как Тип несоответствие: не могу преобразовать из типа элемента Object в myClass.FilterValue – Josef

+0

О да, это из-за типа вашего Вектор. Вы должны указать, что это вектор ! ;-) – Kapcash

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