2012-01-21 32 views
0

我正在使用以下java程序進行自我診斷combobox與從mysql數據庫中檢索值自動建議工作正常。如果我在組合框中鍵入'A'意味着列表將顯示所有以'A'開頭的名字都以該形式添加標籤。如果我在組合框中選擇了一個名稱,則表示相應的ID將顯示在標籤中。我的問題是我有我的Sql數據庫表中開始'A'的四個名稱,如果我選擇'A'開始名稱,將顯示正確的Id。但我清除組合框文本列和類型'B'表示它顯示所有名稱都以'B'開頭,但是我點擊「B」開始的名稱,它不能顯示正確的ID,它顯示'A'起始名稱的ID。因爲我使用getSelectedIndex()獲得ID。自動提示組合框中所有名稱的正確ID?自動排序組合框與檢索從MySQL數據庫的值

package combo; 
import java.sql.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 
import javax.swing.*; 


public class comboauto extends javax.swing.JFrame { 
     Vector v=new Vector(); 
     Vector v1=new Vector(); 
     Statement TmpSqlStmnt; 
     ResultSet TmpSqlRs; 
     Connection con; 
     int CateId; 
     JTextField Txt01; 

    public comboauto() { 
     initComponents(); 
    } 
    public void AutoSuggest() { 
       Txt01=(JTextField)Cbx01.getEditor().getEditorComponent(); 
       Txt01.addKeyListener(new KeyAdapter() { 
       public void keyTyped(KeyEvent e) 
       { 
       EventQueue.invokeLater(new Runnable() 
       { 
        public void run() { 
        String text =Txt01.getText().toUpperCase(); 
        if(text.length()==0) 
          { 
           Cbx01.hidePopup(); 
           setModel(new DefaultComboBoxModel(v1), ""); 
          } 
          else{ 
           DefaultComboBoxModel m = getSuggestedModel(v1, text); 
           if(m.getSize()==0) { 
           Cbx01.hidePopup(); 
           } 
           else{ 
              setModel(m, text); 
             Cbx01.showPopup(); 
            } 
           } 
          } 
          }); 

        } 
       public void keyPressed(KeyEvent e) 
       { 
        String text = Txt01.getText(); 
        int code = e.getKeyCode(); 
        if(code==KeyEvent.VK_ENTER) { 
        if(!v1.contains(text)) { 
        v1.addElement(text); 
        // setModel(getSuggestedModel(v1, text), text); 
      } 
        hide_flag = true; 
     }else if(code==KeyEvent.VK_ESCAPE) { 
     hide_flag = true; 
     }else if(code==KeyEvent.VK_RIGHT) { 
      for(int i=0;i<v1.size();i++) { 
       String str = (String) v1.elementAt(i); 
       if(str.startsWith(text)) 
       { 
     //   Cbx01.setSelectedIndex(-1); 
        Txt01.setText(str); 
        return; 
       } 
      } 
     } 
      } 
     }); 


     try{ 
     Class.forName("com.mysql.jdbc.Driver"); 
     con =DriverManager.getConnection("jdbc:mysql://localhost:3306/project","root","root"); 
     TmpSqlStmnt=con.createStatement(); 
     TmpSqlRs=TmpSqlStmnt.executeQuery ("SELECT CateId,CateName FROM Cust_Masterrecord ORDER BY CateName"); 
     System.out.println("DB Connected"); 
     Cbx01.removeAllItems(); 
     TmpSqlRs.first(); 
      if (Cbx01.getItemCount() == 0) 
      { 

       //Cbx01.addItem(""); 
      do 
       { 
       // String s= TmpSqlRs.getString("CateName"); 
       Cbx01.addItem(TmpSqlRs.getString("CateName")); 
       CateId=TmpSqlRs.getInt("CateId"); 
       v.add(CateId); 
       // s.valueOf(CateId); 
       // System.out.println(s.valueOf(CateId)); 
       // System.out.println(CateId); 
       // for(int i=0;i<CateName.length;i++){ 
       v1.addElement(TmpSqlRs.getString("CateName")); 
       //} 
        Cbx01.addItemListener(new ItemListener() { 
        public void itemStateChanged(ItemEvent e) { 
            if (e.getStateChange() == ItemEvent.SELECTED) { 

             //Cbx01.getItemCount(); 
             //System.out.println(Cbx01.getItemCount()); 
             //Cbx01.getSelectedItem(); 
             //System.out.println(Cbx01.getSelectedItem()); 

             Cbx01.getSelectedIndex(); 
             //System.out.println(Cbx01.getSelectedIndex()); 
             Lbl01.setText(v.get(Cbx01.getSelectedIndex()).toString()); 
             //System.out.println(v.get(Cbx01.getSelectedIndex()).toString()); 
            } 
           } 
          }); 

     }while(TmpSqlRs.next()); 
    }else{Cbx01.addItem("Records Not Available");} 
    }catch(Exception e){ 
    System.out.println(e); 
    } 


    } 

private boolean hide_flag = false; 
     private void setModel(DefaultComboBoxModel mdl, String str) { 
     Cbx01.setModel(mdl); 
     //Cbx01.setSelectedIndex(-1); 
     Txt01.setText(str); 
    } 
private static DefaultComboBoxModel getSuggestedModel(java.util.List<String> list, String text) { 
     DefaultComboBoxModel m = new DefaultComboBoxModel(); 
     for(String s: list) { 
      if(s.startsWith(text)) m.addElement(s); 
     } 
     return m; 
    } 




    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 

     Cbx01 = new javax.swing.JComboBox(); 
     Lbl01 = new javax.swing.JLabel(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     Cbx01.setEditable(true); 
     Cbx01.addPopupMenuListener(new javax.swing.event.PopupMenuListener() { 
      public void popupMenuCanceled(javax.swing.event.PopupMenuEvent evt) { 
      } 
      public void popupMenuWillBecomeInvisible(javax.swing.event.PopupMenuEvent evt) { 
       Cbx01PopupMenuWillBecomeInvisible(evt); 
      } 
      public void popupMenuWillBecomeVisible(javax.swing.event.PopupMenuEvent evt) { 
       Cbx01PopupMenuWillBecomeVisible(evt); 
      } 
     }); 
     Cbx01.addComponentListener(new java.awt.event.ComponentAdapter() { 
      public void componentMoved(java.awt.event.ComponentEvent evt) { 
       Cbx01ComponentMoved(evt); 
      } 
     }); 
     Cbx01.addItemListener(new java.awt.event.ItemListener() { 
      public void itemStateChanged(java.awt.event.ItemEvent evt) { 
       Cbx01ItemStateChanged(evt); 
      } 
     }); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGap(49, 49, 49) 
       .addComponent(Cbx01, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addGap(45, 45, 45) 
       .addComponent(Lbl01, javax.swing.GroupLayout.PREFERRED_SIZE, 122, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(103, Short.MAX_VALUE)) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGap(110, 110, 110) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
        .addComponent(Cbx01, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addComponent(Lbl01, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)) 
       .addContainerGap(170, Short.MAX_VALUE)) 
     ); 

     pack(); 
    }// </editor-fold>       

    private void Cbx01ItemStateChanged(java.awt.event.ItemEvent evt) {          
//Lbl01.setText(v.get(Cbx01.getSelectedIndex()).toString());  // TODO add your handling code here: 
    }          

    private void Cbx01ComponentMoved(java.awt.event.ComponentEvent evt) {          
//Lbl01.setText(v.get(Cbx01.getSelectedIndex()).toString());  // TODO add your handling code here: 
    }          

    private void Cbx01PopupMenuWillBecomeVisible(javax.swing.event.PopupMenuEvent evt) {             
    // Lbl01.setText(v.get(Cbx01.getSelectedIndex()).toString()); // TODO add your handling code here: 
    }             

    private void Cbx01PopupMenuWillBecomeInvisible(javax.swing.event.PopupMenuEvent evt) {             
     // Lbl01.setText(v.get(Cbx01.getSelectedIndex()).toString()); // TODO add your handling code here: 
    }             

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String args[]) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       comboauto Tmpobj1= new comboauto(); 
       Tmpobj1.AutoSuggest(); 
       Tmpobj1.setVisible(true); 

      } 
     }); 
    } 

    // Variables declaration - do not modify      
    private javax.swing.JComboBox Cbx01; 
    private javax.swing.JLabel Lbl01; 
    // End of variables declaration     

} 
+0

忘記在進入循環之前清除'v'和'v1'? –

回答

0

您可以將對象添加到組合框而不是添加字符串。該對象可以包含名稱和ID,確保它有toString方法返回名稱。然後,您可以通過在組合框上調用getSelectedItem來取回所選對象。

+0

如何創建對象包含名稱和ID? – fernandas

+0

這是這樣的: public class MenuItemData private int id { private int id; 私人字符串名稱; ...(獲得/設置方法) public String toString(){return this.name;} } –

0

更換do whilewhile(TmpSqlRs.next());)與while並檢查是否輸出正常與否來了...

+0

否如果我使用While條件輸出不正確 – fernandas

+0

什麼不正確? –

+0

我認爲你在B中獲得了一個ID,就像'do'正在執行B時一樣,它也有'A'的列表... –