首页 > 解决方案 > 如何检索jComboBox中绑定在数据库表中的对象并将其存储到另一个表中

问题描述

我在我的数据库中创建了一个名为“model”和“item”的表。并创建了类 Model() 和 Item()。对于表“模型”,它具有以下字段:model_ID 和 model_description。对于表“item”:item_ID、item_description、model_ID。

通过使用 Netbeans 8.2 绑定表“模型”和 jComboBox,我能够在 jComboBox 中显示 model_description。

现在我要做的是将 jComboBox 中的选定项目存储到我的“项目”表中。

我试过这段代码:

Session session = NewHibernateUtil.getSessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Model model = (Model) session.get(Model.class, jComboBox.getSelectedIndex+1);
Item item = new Item();
item.setDescription(description);
item.setModel(model);
session.save(item);
transaction.commit();
session.close();

这段代码的问题是,如果我将 jComboBox 中 model_description 的显示按升序/降序排序,它不会返回正确的对象。

有没有办法将 jComboBox 中的选定项目直接存储为模型对象?

谢谢你的帮助!

标签: javaswingnetbeansjcombobox

解决方案


通过使用 Netbeans 8.2 绑定表“模型”和 jComboBox,我能够在 jComboBox 中显示 model_description。

我不知道 Netbeans 绑定做了什么,但这对我来说似乎不是一个好的解决方案。如果您从 Netbeans 平台迁移,您的代码将如何工作,或者您将来如何能够做到这一点?

相反,我建议您可以在 JComboBox 中存储自定义对象。因此,您可以将 Item 对象存储在组合框中,然后创建自定义渲染器以在组合框中显示“描述”。

当您想要您刚刚使用的选定项目时:

comboBox.getSelectedItem() 

并且您可以访问您的 Item 对象及其所有属性。

自定义渲染器看起来像:

class FooRenderer extends BasicComboBoxRenderer
{
    public Component getListCellRendererComponent(
        JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
    {
        super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);

        if (value instanceof Foo)
        {
            Foo foo = (Foo)value;
            setText( foo.getDescription() );
        }

        return this;
    }
}

将“Foo”对象替换为您的“Item”对象。

但是,当您使用自定义渲染器时,您将破坏组合框,因为您将无法再使用键盘通过键入项目描述的第一个字符来选择项目。有关此问题和解决方案的更多信息,请参阅带有自定义渲染器的组合框。


推荐阅读