-1

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

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

当我拥有该值时,我可以将该值传递给另一个方法来检索与该 foodId 关联的相关食品。假设 getter 和 setter 已经完成。

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

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;
    }   
4

2 回答 2

6

建议:

  • 不要用字符串填充 JList,而是......
  • 如果您使用同时包含名称和 ID 的对象填充 JList,那么您做得很好。
  • 您可能希望为您的 JList 提供一个单元格渲染器,以帮助它显示您希望 JList 显示的对象的信息。
  • 然后获取 ID 只需在您使用的任何侦听器中从 JList 中获取所选项目,将其转换为实际上是的对象类型,然后调用 getter 方法,例如getId(),假设 this 的对象输入有这个方法,然后使用你的ID。

请注意,这并没有告诉我们任何有用的信息:

list_1.setModel(food.populateJList());

如果我的建议不能帮助您回答您的问题,那么请提供更多有用的信息和代码,这些信息将有助于我们全面了解您的问题。


编辑 2

您的最新代码表明您正在做我建议您不要做的事情:

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);     
}

您正在向 DefaultListModel 添加字符串,这样做会丢失数据库提供给您的所有其他信息。

再次不要向此模型添加字符串。创建一个具有两个或多个字段的类,一个用于类别 String,一个用于所有者 ID,它具有 getter、setter 和一个构造函数,允许您将此信息传递到类的对象中,创建此类的对象在上面的 while 循环中,并将这些添加到 JList 模型中。然后为您的 JList 提供一个自定义渲染器,这比toString()为此目的为自定义对象提供一个方法更好。

  • 创建一个自定义类,例如名为 FoodInfo
  • 将 DefaultListModel 声明为接受这种类型的对象,DefaultListModel<FoodInfo>
  • 然后将这种类型的对象添加到模型中:

例如,

DefaultListModel<FoodInfo> model = new DefaultListModel<FoodInfo>();

// ... other code to get database info

while (rs.next()) {
   String foodCat = rs.getString("food_Category");
   int id = rs.getInt("store_Owner_Id");
   FoodInfo foodInfo = new FoodInfo(foodCat, id);
   model.addElement(foodInfo);
}

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

于 2013-10-21T21:42:20.560 回答
3

请参阅带有隐藏数据的组合框。它将向您展示如何在不需要自定义渲染器的情况下使用自定义对象。我知道标题是“组合框”,但 JList 的概念是相同的。

当您使用自定义渲染器时,您会破坏 JList 的默认功能,因为您将不再能够使用键盘选择项目。一个设计合理的 GUI 应该允许用户使用鼠标或键盘来选择一个项目。

于 2013-10-22T01:00:50.813 回答