如何从JList中检索项目ID

时间:2013-10-21 21:32:45

标签: java mysql swing jlist mouse-listeners

我有一个JList,它根据数据库显示名称。与这些名称相关联的是ID。例如,foodId = 1,foodName =中文。

如果我点击JList上的某个项目,我需要捕获与点击的foodName相关联的foodID。我知道需要一个变量。

当我有这个值时,我可以将该值传递给另一个方法来检索与该foodId相关的相关食品。假设getters&制定者已经完成。

我只有以下内容,&我卡住了。请指教,谢谢。

list_1.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent evt) {              
                //alter text of Label acc to clicked item @ JList
                JList list = (JList)evt.getSource();
                System.out.println (list.getSelectedValue());

                //store int value of item clicked @ JList
                int temp = 0;
                temp = ???????????

                //populate JPanel
                Food food = new Food();
                JPanel panel = new JPanel();                
                panel.setBounds(153, 74, 281, 269);
                panel.add(food.populateWithButtons());              

                contentPane.add(panel);
            }
        });
        list_1.setBorder(new LineBorder(new Color(0, 0, 0), 0));
        //populate JList
        list_1.setModel(food.populateJList());



public ListModel populateJList()
    {
        DefaultListModel model = new DefaultListModel();

        ResultSet rs = null;
        DataAccessObject db = new DataAccessObject();
        db.setUp("customer");

        String dbQuery = "SELECT store_Owner_Id, food_Category FROM store_owner";       
        rs = db.readRequest(dbQuery);

        try
        {
            while (rs.next())
            {
                food_Category = rs.getString("food_Category");
                store_Owner_Id = rs.getInt("store_Owner_Id");
                model.addElement(food_Category);                

                System.out.println (store_Owner_Id);    //test DB conn & print retrieved items
                System.out.println (food_Category);     
            }                   
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        db.terminate();
        return model;
    }   

2 个答案:

答案 0 :(得分:5)

建议:

  • 不要使用字符串填充JList,而是......
  • 如果使用包含名称和ID的对象填充JList,那么表现良好。
  • 您可能希望为JList提供一个单元格渲染器,以帮助它显示您希望JList显示的对象的信息。
  • 然后获取ID只是从您正在使用的任何侦听器中的JList中获取所选项目,将其转换为实际上的对象类型,然后调用getter方法,例如{{1假设此类型的对象具有此方法,然后使用您的ID。

请注意,这告诉我们没什么用处:

getId()

如果我的建议无法帮助您回答您的问题,请提供更多有用的信息和代码,以帮助我们充分了解您的问题。


修改2

您的最新代码显示您正在执行我建议您执行的操作:

list_1.setModel(food.populateJList());

您正在将Strings添加到DefaultListModel,这样就会丢失数据库为您提供的所有其他信息。

再次不要将字符串添加到此模型中。创建一个具有两个或多个字段的类,一个用于类别String,另一个用于所有者ID,具有getter,setter和构造函数,允许您将此信息传递到类的对象中,创建此类的对象在上面的while循环中,将这些添加到JList模型中。然后为JList提供一个自定义渲染器,这比为此目的为自定义对象提供while (rs.next()) { food_Category = rs.getString("food_Category"); store_Owner_Id = rs.getInt("store_Owner_Id"); model.addElement(food_Category); // ****** here System.out.println (store_Owner_Id); System.out.println (food_Category); } 方法更好。

  • 创建一个自定义类,比如称为FoodInfo
  • 将DefaultListModel声明为接受此类型的对象的toString()
  • 然后将此类型的对象添加到模型中:

如,

DefaultListModel<FoodInfo>

编辑3
正如@ dic19在评论中所指出的那样,不要在JList上使用MouseListener,而是使用JList Tutorial中描述的ListSelectionListener。

答案 1 :(得分:3)

Combo Box With Hidden Data。它将向您展示如何使用自定义对象而无需自定义渲染器。我知道标题是“组合框”,但JList的概念是相同的。

使用自定义渲染器时,您将破坏JList的默认功能,因为您将无法再使用键盘选择项目。正确设计的GUI应允许使用鼠标或键盘来选择项目。