Значок настройки и значения JComboBox
Можно ли установить значение и метку на JComboBox
, чтобы я мог показать метку, но получить другое значение?
Например, в JavaScript я могу сделать:
document.getElementById("myselect").options[0].value //accesses value attribute of 1st option
document.getElementById("myselect").options[0].text //accesses text of 1st option
Ответы
Ответ 1
Вы можете поместить любой объект внутри JComboBox. По умолчанию он использует метод toString объекта для отображения метки в поле со списком с помощью клавиатуры. Итак, лучший способ - это, вероятно, определить и использовать соответствующие объекты внутри комбо:
public class ComboItem {
private String value;
private String label;
public ComboItem(String value, String label) {
this.value = value;
this.label = label;
}
public String getValue() {
return this.value;
}
public String getLabel() {
return this.label;
}
@Override
public String toString() {
return label;
}
}
Ответ 2
Вот интерфейс и класс утилиты, которые позволяют легко использовать поле со списком для разных ярлыков. Вместо того, чтобы создавать замену ListCellRenderer
(и рискуя выглядеть неуместно, если внешний вид меняется), в этом случае используется ListCellRenderer
по умолчанию (что бы это ни было), но заменяя ваши собственные строки как текст ярлыка вместо тех, которые определены toString()
в ваших объектах значения.
public interface ToString {
public String toString(Object object);
}
public final class ToStringListCellRenderer implements ListCellRenderer {
private final ListCellRenderer originalRenderer;
private final ToString toString;
public ToStringListCellRenderer(final ListCellRenderer originalRenderer,
final ToString toString) {
this.originalRenderer = originalRenderer;
this.toString = toString;
}
public Component getListCellRendererComponent(final JList list,
final Object value, final int index, final boolean isSelected,
final boolean cellHasFocus) {
return originalRenderer.getListCellRendererComponent(list,
toString.toString(value), index, isSelected, cellHasFocus);
}
}
Как вы можете видеть, ToStringListCellRenderer
получает пользовательскую строку из реализации ToString
, а затем передает ее исходному ListCellRenderer
вместо передачи в самом объекте значения.
Чтобы использовать этот код, выполните следующие действия:
// Create your combo box as normal, passing in the array of values.
final JComboBox combo = new JComboBox(values);
final ToString toString = new ToString() {
public String toString(final Object object) {
final YourValue value = (YourValue) object;
// Of course you'd make your own label text below.
return "custom label text " + value.toString();
}
};
combo.setRenderer(new ToStringListCellRenderer(
combo.getRenderer(), toString)));
Как и для создания пользовательских меток, если вы создаете реализацию ToString
, которая создает строки, основанные на системе Locale, вы можете легко интернационализировать поле со списком, не изменяя ничего в своих объектах значений.
Ответ 3
Пожалуйста, можете показать мне полный пример?
Экземпляры Enum
особенно удобны для этого, так как toString()
"возвращает имя этой константы перечисления, содержащееся в декларации".
![enter image description here]()
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
/** @see http://stackoverflow.com/questions/5661556 */
public class ColorCombo extends JPanel {
private Hue hue = Hue.values()[0];
public ColorCombo() {
this.setPreferredSize(new Dimension(320, 240));
this.setBackground(hue.getColor());
final JComboBox colorBox = new JComboBox();
for (Hue h : Hue.values()) {
colorBox.addItem(h);
}
colorBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Hue h = (Hue) colorBox.getSelectedItem();
ColorCombo.this.setBackground(h.getColor());
}
});
this.add(colorBox);
}
private enum Hue {
Cyan(Color.cyan), Magenta(Color.magenta), Yellow(Color.yellow),
Red(Color.red), Green(Color.green), Blue(Color.blue);
private final Color color;
private Hue(Color color) {
this.color = color;
}
public Color getColor() {
return color;
}
}
private static void display() {
JFrame f = new JFrame("Color");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new ColorCombo());
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
display();
}
});
}
}
Ответ 4
Используйте ListCellRenderer, чтобы достичь желаемого. Создайте класс, который расширяет JLabel
и реализует ListCellRenderer
. Задайте этот класс как средство визуализации в JComboBox
с помощью метода setRenderer()
. Теперь, когда вы получаете доступ к значениям из jcombobox, он будет иметь тип jlabel.
Ответ 5
Шаг 1 Создайте класс с двумя свойствами JComboBox
, id, name, например
public class Product {
private int id;
private String name;
public Product(){
}
public Product(int id, String name){
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
//this method return the value to show in the JComboBox
@Override
public String toString(){
return name;
}
}
Шаг 2 В дизайне формы щелкните правой кнопкой мыши JComboBox
и выберите Properties, затем откройте вкладку кода и в свойстве Type Parameters введите имя класса, в нашем примере это Product.
![enter image description here]()
Шаг 3 Теперь создайте метод, который подключается к базе данных с помощью запроса для создания списка продуктов, этот метод получает в качестве параметра объект JComboBox
.
public void showProducts(JComboBox <Product> comboProduct){
ResultSet res = null;
try {
Connection conn = new Connection();
String query = "select id, name from products";
PreparedStatement ps = conn.getConecction().prepareStatement(query);
res = ps.executeQuery();
while (res.next()) {
comboProduct.addItem(new Product(res.getInt("id"), res.getString("name")));
}
res.close();
} catch (SQLException e) {
System.err.println("Error showing the products " + e.getMessage());
}
}
Шаг 4 Вы можете вызвать метод из формы
public frm_products() {
initComponents();
Product product = new Product();
product.showProducts(this.cbo_product);
}
Теперь вы можете получить доступ к выбранному идентификатору, используя метод getItemAt
System.out.println(cbo_product.getItemAt(this.cbo_product.getSelectedIndex()).getId());