Java jcombobox(显示名称和返回代码)

Java jcombobox(显示名称和返回代码),java,swing,Java,Swing,我的数据库中有一个表,其中有一些名称和相应的代码,现在我想在jcombobox中显示名称,但是当我从jcombobox中选择任何名称时,应该返回相应的代码 这张桌子像 名称代码 a 1 b 2 c 3有没有看过 激发的事件总是两次 您需要将代码存储在ArrayList中,并使用组合框的选择索引检索当前代码 private JComboBox comboBox; private List<Integer> codes; private void createUI() { co

我的数据库中有一个表,其中有一些名称和相应的代码,现在我想在jcombobox中显示名称,但是当我从jcombobox中选择任何名称时,应该返回相应的代码

这张桌子像

名称代码 a 1 b 2 c 3有没有看过

激发的事件总是两次


您需要将代码存储在ArrayList中,并使用组合框的选择索引检索当前代码

private JComboBox comboBox;
private List<Integer> codes;

private void createUI() {
    comboBox = new JComboBox();
    codes = new ArrayList<Integer>();
    addItem("one", 42);
    addItem("two", 127);
    comboBox.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println(comboBox.getSelectedIndex());
            System.out.println(codes.get(comboBox.getSelectedIndex()));
        }
    });
    add(comboBox);
}

private void addItem(String name, int code) {
    comboBox.addItem(name);
    codes.add(code);
}

为什么不使用列表单元格渲染器将代码和名称包装到object&中,只渲染ame,然后可以从中获取返回的对象。getSelectedItem&从中提取代码

您可以创建一个包装类-我们称之为TableElement:

然后,您可以创建一个包含所有表元素的数组,并像下面这样创建JComboBox

Vector<TableElement> vect = new Vector<TableElement>();
for (/* all your table elements */) 
  vect.add(new TableElement(elementName, elementValue);
JComboBox comboBox = new JComboBox(vect);

我可以使用ItemListener并从JComboBox获取所选名称,但是如何获取该名称的代码?假设我有这样的表a 1 b 2 c 3,现在我显示a,b,在JCOMBOBOX中,当使用GETSCORDETION项目时,我想要得到1或2或3的ITEME。G A或B或C希望您理解我的问题。我不能显示表的视图。在问题中查找编辑,表格在哪里?它在JTable中吗?还是在地图上?还是在文件中?您希望它返回到哪里?表在我的数据库中。我使用查询从表中获取所有名称,然后将它们显示在jcombobox中。我想要的是,当我使用getSelectedItem时,它将从tablein数据库中为我提供与该名称对应的代码。您不需要非默认单元格呈现程序,只需覆盖包装类中的ObjecttoString即可显示名称。。。见我的答案+1自定义渲染器是当场-这是摆动小硬币自定义视觉表现。其他一切或多或少都是次优的。我并不真正喜欢这个解决方案,因为您将数据拆分到单独的数据结构列表JComboBox中。同意,但实现起来更快。提取助手类和自定义渲染器可以稍后完成-这意味着“从不”:-无论如何,我对您更优雅的解决方案进行了改进。同意,您的解决方案不需要包装器类,这样可以更快地实现。所以这是一个有效的快速解决方案+1-1更快的实现速度是除最琐碎的应用程序之外的最糟糕的驱动力-@kleopatra在这里可能是这样的-1虽然可能,但不建议这样做:永远不要因为查看原因而调整数据。相反,实现一个渲染器——这是负责自定义视图的部分。@kleopatra我在哪里对它进行了调整?您必须将它放入某种排序或数组/列表中,以便在JComboBox中显示它。你是说toString?还是使用包装器类的一般方法?如果是这样的话,你能提供一个有效的解决方案,而不是只对每个答案投否决票而不给出替代方案吗?顺便说一句,toString的唯一目的是为了查看。该方法不应用于其他内容…@kleopatra如果两个或多个项目具有相同的字符串值,则没有其他方法,JComboBox&JList无法做到这一点,显示是正确的,但getXxxXxx的所有方法都是错误的:-您可能希望在不同的位置查看TableElement中的相同内容。。好视图,显示不同的方面。那你怎么办?每个视图实现一个新的包装器?当然可以,但这并不是摇摆不定的,因为有一个类被设计来接管定制的视觉表示,顺便说一句:我已经给出了另一个选择。。。阅读我的第一条评论,它以:-开头,我并没有否决每一个答案,只有不正确的/次优的答案,正确的得到了一张赞成票。
Vector<TableElement> vect = new Vector<TableElement>();
for (/* all your table elements */) 
  vect.add(new TableElement(elementName, elementValue);
JComboBox comboBox = new JComboBox(vect);
TableElement selected = (TableElement)comboBox.getSelectedItem();
System.out.println("name = " +selected.name + ",value = " + selected.value);