Значения JComboBox

Возможно ли, чтобы определить значения, отличные от фактического содержимого в JComboBox? В HTML это выглядит следующим образом:

<select>
 <option value="value1">Content1</option>
 <option value="value2">Content2</option>
 <option value="value3">Content3</option>
</select>

Здесь можно получить короткое значение, независимо от того, как долго его содержимое. В Java я знаю только следующее решение:

// Creating new JComboBox with predefined values
 String[] petStrings = { "Bird", "Cat", "Dog", "Rabbit", "Pig" }; 
 private JComboBox combo = new JComboBox(petStrings);
// Retrieving selected value
 System.out.println(combo.getSelectedItem());

Но здесь я бы получил только "Cat", "Dog" и т.д. Проблема в том, что я хочу загрузить все имена клиентов из базы данных в JComboBox, а затем получить идентификатор от выбранного клиента. Он должен выглядеть следующим образом:

<select>
 <option value="104">Peter Smith</option>
 <option value="121">Jake Moore</option>
 <option value="143">Adam Leonard</option>
</select>
3 ответа

Если вы создаете класс Customer и загружаете список объектов Customer в combobox, тогда вы получите то, что хотите. В поле со списком будет отображаться toString() вашего объекта, поэтому класс Customer должен вернуть имя в toString(). Когда вы извлекаете выбранный элемент, это объект Customer, из которого вы можете получить идентификатор или что-то еще, что вы хотите.

Вот пример, иллюстрирующий то, что я предлагаю. Тем не менее, было бы неплохо следовать советам kleopatra и mKorbel, когда вы заработаете эту основную идею.

import java.awt.BorderLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class ComboJumbo extends JFrame{
 JLabel label;
 JComboBox combo;
 public static void main(String args[]){
 new ComboJumbo();
 }
 public ComboJumbo(){
 super("Combo Jumbo");
 label = new JLabel("Select a Customer");
 add(label, BorderLayout.NORTH);
 Customer customers[] = new Customer[6];
 customers[0] = new Customer("Frank", 1);
 customers[1] = new Customer("Sue", 6);
 customers[2] = new Customer("Joe", 2);
 customers[3] = new Customer("Fenton", 3);
 customers[4] = new Customer("Bess", 4);
 customers[5] = new Customer("Nancy", 5);
 combo = new JComboBox(customers);
 combo.addItemListener(new ItemListener(){
 public void itemStateChanged(ItemEvent e) {
 Customer c = (Customer)e.getItem();
 label.setText("You selected customer id: " + c.getId());
 }
 });
 JPanel panel = new JPanel();
 panel.add(combo);
 add(panel,BorderLayout.CENTER);
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 setSize(400, 200);
 setVisible(true);
 }
 class Customer{
 private String name;
 private int id;
 public Customer(String name, int id){
 this.name = name;
 this.id = id;
 }
 public String toString(){
 return getName();
 }
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
 public int getId() {
 return id;
 }
 public void setId(int id) {
 this.id = id;
 }
 }
 }


Предполагая, что у вас есть класс Person, который содержит имена и идентификаторы, вы можете добавить экземпляры этого класса в качестве объектов поля со списком. getSelectedItem() затем вернет экземпляр выбранного лица.

Проблема заключается в том, чтобы отобразить человека правильно в поле со списком. Вы можете перегрузить toString в классе, чтобы вернуть имя, или вы можете предоставить свой собственный ListCellRenderer в поле со списком и отобразить все, что пожелаете (например, миниатюры фотографий) в поле со списком.


Я просто ответил на другой вопрос в qaru.site/questions/471451/..., который объясняет хороший способ создания пользовательского ListCellRenderer, который заменяет toString() на класс значения альтернативными метками.

licensed under cc by-sa 3.0 with attribution.