Java 编辑字段中具有不同文本的可编辑JComboBox
我一直在寻找一种方法来创建一个Java 编辑字段中具有不同文本的可编辑JComboBox,java,swing,jcombobox,Java,Swing,Jcombobox,我一直在寻找一种方法来创建一个JComboBox,其中列表中的项目正常显示,但在编辑字段中仅显示一个数字 我遇到了以下代码(仅根据我的需要进行了轻微修改): 这很好,直到我使用comboBox.setEditable(true)使组合框可编辑为止 背景资料: 我计划在用户在编辑字段中键入时,使用数据库中的对象填充弹出列表。当用户从弹出列表中选择项目时,编辑字段应仅显示对象的id,但弹出列表应显示更多信息,以便用户做出明智的选择 无论是打开还是关闭“可编辑”,有人能帮我完成这项工作吗?如果我正确理
JComboBox
,其中列表中的项目正常显示,但在编辑字段中仅显示一个数字
我遇到了以下代码(仅根据我的需要进行了轻微修改):
这很好,直到我使用comboBox.setEditable(true)使组合框可编辑为止代码>
背景资料:
我计划在用户在编辑字段中键入时,使用数据库中的对象填充弹出列表。当用户从弹出列表中选择项目时,编辑字段应仅显示对象的id
,但弹出列表应显示更多信息,以便用户做出明智的选择
无论是打开还是关闭“可编辑”,有人能帮我完成这项工作吗?如果我正确理解您的请求,您可以使用自己的javax.swing.Comboxeditor
我刚刚以您为例,添加了一个非常快速的'n'dirty ComboBox编辑器,它使用javax.swing.JTextField
,并将其设置为秒ComboBox编辑器
也许这个例子向您展示了一种处理问题的方法
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
import javax.swing.ComboBoxEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JTextField;
import javax.swing.plaf.basic.BasicComboBoxRenderer;
public class ComboBoxItem extends JFrame implements ActionListener {
public ComboBoxItem() {
final Vector model = new Vector();
model.addElement(new Item(1, "car"));
model.addElement(new Item(2, "plane"));
model.addElement(new Item(3, "train"));
model.addElement(new Item(4, "boat"));
JComboBox comboBox;
comboBox = new JComboBox(model);
comboBox.addActionListener(this);
this.getContentPane().add(comboBox, BorderLayout.NORTH);
comboBox = new JComboBox(model);
// I want the comboBox editable.
comboBox.setEditable(true);
comboBox.setRenderer(new ItemRenderer());
comboBox.setEditor(new MyComboBoxEditor()); ///<------- Quick'n'Dirty editor added
comboBox.addActionListener(this);
this.getContentPane().add(comboBox, BorderLayout.SOUTH);
}
@Override
public void actionPerformed(final ActionEvent e) {
final JComboBox comboBox = (JComboBox) e.getSource();
final Item item = (Item) comboBox.getSelectedItem();
System.out.println(item.getId() + " : " + item.getDescription());
}
class MyComboBoxEditor implements ComboBoxEditor {
JTextField editor;
Item editedItem;
@Override
public void addActionListener(final ActionListener l) {
}
@Override
public Component getEditorComponent() {
if (this.editor == null) {
this.editor = new JTextField();
}
return this.editor;
}
@Override
public Object getItem() {
return this.editedItem;
}
@Override
public void removeActionListener(final ActionListener l) {
// TODO Auto-generated method stub
}
@Override
public void selectAll() {
// TODO Auto-generated method stub
}
@Override
public void setItem(final Object anObject) {
this.editedItem = (Item) anObject;
this.editor.setText(String.valueOf(this.editedItem.getId()));
}
}
class ItemRenderer extends BasicComboBoxRenderer {
@Override
public Component getListCellRendererComponent(final JList list, final Object value, final int index, final boolean isSelected,
final boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if (value != null) {
final Item item = (Item) value;
this.setText(item.getDescription().toUpperCase());
}
if (index == -1) {
final Item item = (Item) value;
this.setText("" + item.getId());
}
return this;
}
}
class Item {
private final int id;
private final String description;
public Item(final int id, final String description) {
this.id = id;
this.description = description;
}
public int getId() {
return this.id;
}
public String getDescription() {
return this.description;
}
@Override
public String toString() {
return this.description;
}
}
public static void main(final String[] args) {
final JFrame frame = new ComboBoxItem();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
导入java.awt.BorderLayout;
导入java.awt.Component;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.util.Vector;
导入javax.swing.ComboBoxEditor;
导入javax.swing.JComboBox;
导入javax.swing.JFrame;
导入javax.swing.JList;
导入javax.swing.JTextField;
导入javax.swing.plaf.basic.BasicComboxRenderer;
公共类ComboBoxItem扩展JFrame实现ActionListener{
公共ComboxItem(){
最终向量模型=新向量();
型号补遗(新项目(1,“car”);
型号.附录(新项目(2,“平面”);
型号补遗(新项目(3,“列车”);
模型补遗(新项目(4,“船”);
JComboBox组合框;
comboBox=新的JComboBox(型号);
comboBox.addActionListener(这个);
this.getContentPane().add(组合框,BorderLayout.NORTH);
comboBox=新的JComboBox(型号);
//我希望组合框可编辑。
comboBox.setEditable(真);
setRenderer(新的ItemRenderer());
comboBox.setEditor(new MyComboBoxEditor());//您需要覆盖组合框的默认编辑器,因为当您将组合框设置为可编辑时,它使用编辑器呈现您在下拉列表中选择的内容
下面是使用BasicComboxeditor的一种实现方法。您只需要重写setItem方法
comboBox.setEditor(new ItemEditor());
class ItemEditor extends BasicComboBoxEditor {
public void setItem(Object anObject) {
Item item = (Item) anObject;
editor.setText(item.getId() + "");
}
}
非常感谢。这个答案简短、清晰、直截了当。
comboBox.setEditor(new ItemEditor());
class ItemEditor extends BasicComboBoxEditor {
public void setItem(Object anObject) {
Item item = (Item) anObject;
editor.setText(item.getId() + "");
}
}