2013-01-08 27 views
0

使用JComboBox來搜索來自sql數據庫的查詢。這是我的代碼。將JComboBox用作搜索框

private void srKeyTyped(java.awt.event.KeyEvent evt){ 
    sr.removeAllItems(); 
    String sch = ((JTextField)sr.getEditor().getEditorComponent()).getText(); 
    String schh = "SELECT * FROM tbl WHERE name LIKE '" + sch + "%';"; 
    search = conn.getQuery(schh); 
    try { 
     while (search.next()) { 
      String item = search.getString("name"); 
      sr.addItem(item); 
     } 
    } catch (SQLException ex) { 
     Logger.getLogger(dataprocess.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    sr.setSelectedItem(null); 
    sr.setPopupVisible(true); 

    System.out.println(sch); 
} 

sr = JComboBox中

但是當我在組合框中鍵入一個字母,它增加了在數據庫中的所有項目。我開始知道System.out.println(sch);總是給出一個空字符串。只要我鍵入一個字母,組合框的文本字段變空(我不能用兩個字母輸入一個單詞)。如何解決這個問題?謝謝。

+1

removeAllItems可能清除編輯器(沒掏,雖然) – kleopatra

+0

也許只是一味的文本設置重新編輯,將所有物品和展示後彈出窗口? 'removeAllItems()'確實會清除文本 –

+1

在事件派發線程上執行數據庫查詢並不是一個好主意,當然不是每次擊鍵都會執行。此外,你爲什麼有權訪問'KeyEvent'。 「JComboBox」的編輯器支持「DocumentListener」,它幾乎總是更好的選擇 – Robin

回答

1

對你的問題的原因有以下幾點:

  1. sch總是空的,是因爲你在呼喚sr.removeAllItems();你打電話之前String sch = ((JTextField)sr.getEditor().getEditorComponent()).getText();。這意味着JComboBox的內容在被選中之前被清除(與選擇一起)。

    解決方案:致電sr.removeAllItems();在獲得選定項目後。

  2. 組合框變空,因爲您在重新填充它後在最後調用sr.setSelectedItem(null);

    解決方法:如果你想輸入的文本,然後sr.getEditor().setItem(scr);

只有和想法,但儘量封閉方法的內容在if statement,如果按下Enter key檢查。這樣方法內容將只在所需的字符串輸入後執行,而不是每次按下某個鍵時執行。

+0

非常感謝。你的解決方案工作正常謝謝。 – Hasi007

1

使用ActionListener而不是尋找按鍵。當一個組合框的選擇被編輯時,它將在編輯完成時觸發ActionEvent

當你得到這個零件的工作,你應該把這個邏輯關閉到另一個線程,並在它返回時填充組合框的項目。否則,當SQL查詢發生時,您的UI將掛起。

0

得到了解決方案。此代碼工作正常。

private void srKeyTyped(java.awt.event.KeyEvent evt){ 

    String sch = ((JTextField)sr.getEditor().getEditorComponent()).getText(); 
    String schh = "SELECT * FROM tbl WHERE name LIKE '" + sch + "%';"; 
    search = conn.getQuery(schh); 
    sr.removeAllItems(); 
    try { 
     while (search.next()) { 
      String item = search.getString("name"); 
      sr.addItem(item); 
     } 
    } catch (SQLException ex) { 
     Logger.getLogger(dataprocess.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    System.out.println(sch); 
    sr.setSelectedItem(null); 
    sr.setPopupVisible(true); 
    ((JTextField)sr.getEditor().getEditorComponent()).setText(sch); 
    } 

感謝Skepi,克列奧帕特拉,紀堯姆波萊