2013-10-21 115 views
-1

我有一個JList,它根據數據庫顯示名稱。與這些名稱相關聯的是ID。例如,foodId = 1,foodName =中文。如何從JList中檢索項目ID

如果我點擊JList上的一個項目,我需要捕獲與點擊的foodName關聯的foodID。我知道一個變量是需要的。

當我有這個值,我可以將該值傳遞到另一個方法來檢索與該foodId相關的相關食品項目。假定getters & setters完成。

我只有以下,&卡住了。請指教謝謝。

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

回答

5

建議:

  • 不要在用繩子將JList而是...
  • 如果您填充您的JList具有包含兩個名稱和ID的對象,那麼你」重新做得好。
  • 您可能希望爲您的JList提供一個單元格渲染器,以幫助它顯示您希望JList顯示的對象的信息。
  • 然後獲取ID只需從JList中的選定項目中取出您正在使用的任何偵聽器,將其轉換爲事實上的對象類型,然後調用getter方法,如getId(),假設該類型的對象具有此方法,然後使用您的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。

+0

當我調用方法'populateJList()'我已經有了id和名字。我想知道如何將它放在代碼中。請親切看看我更新的代碼,也許給我一個例子?非常感謝。 – brainsfrying

+0

@brainsfrying:請不要問我們的代碼。您仍然隱瞞關鍵信息,例如您正在將哪些內容放入JList模型中。你告訴我們的只是一個方法調用,'list_1.setModel(food.populateJList());',這又告訴我們什麼都沒有用。請爲我們充實這一點。 –

+0

對不起,我可能會誤解。 populateJList()更新@我的問題再次。請讓我知道是否需要更多信息。 – brainsfrying

3

請參閱Combo Box With Hidden Data。它將向您展示如何使用自定義對象而不需要自定義渲染器。我知道標題是「組合框」,但這個概念對於JList是相同的。

當您使用自定義渲染器時,會破壞JList的默認功能,因爲您將不再能夠使用鍵盤選擇項目。正確設計的GUI應允許使用鼠標或鍵盤來選擇項目。