Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 编辑字段中具有不同文本的可编辑JComboBox_Java_Swing_Jcombobox - Fatal编程技术网

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