是否可以将值和标签设置为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
答案 0 :(得分:26)
您可以将任何对象放在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;
}
}
答案 1 :(得分:8)
这是一个实用程序界面和类,可以让组合框轻松使用不同的标签。而不是创建替换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
实现,您可以轻松地将组合框国际化,而无需更改值对象中的任何内容。 / p>
答案 2 :(得分:6)
拜托,能给我看一个完整的例子吗?
Enum
的实例对此特别方便,因为toString()
“返回此枚举常量的名称,如声明中所包含。”
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();
}
});
}
}
答案 3 :(得分:1)
使用ListCellRenderer来实现您的目标。创建一个扩展JLabel
并实现ListCellRenderer
的类。使用JComboBox
方法在setRenderer()
中将该类设置为渲染器。现在,当您从jcombobox访问值时,它将是jlabel类型。
答案 4 :(得分:0)
第1步
创建一个具有JComboBox
,id和名称之类的两个属性的类
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
,然后选择“属性”,现在打开代码选项卡,然后在“类型参数”属性中输入类的名称,在我们的示例中为Product。
第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
方法访问选定的ID
System.out.println(cbo_product.getItemAt(this.cbo_product.getSelectedIndex()).getId());