2012-01-21 10 views
0

Используйте следующую программу для извлечения значения из моей базы данных sql в combobox.if. Я выбираю первый элемент в JComboBox из базы данных mysql с использованием ResultSet, он не показывает значение id первого элемента имя. если я выбрал второй элемент в combobox (набор результатов) , он показывает значение id второго имени выбранного элемента. После того, как я нажму на первый элемент, вы увидите первое значение идентификатора элемента в поле метки. моя проблема - первое имя элемента не показывает значение ID в поле метки, это означает, что мое первое значение набора записей не показывает значение id?Извлечь значение из базы данных в combobox

package javacmbx; 

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


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


    public comboautosuggest() { 
     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); 
       } 
        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)) 
       { 
        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 location,pincode FROM combovalue ORDER BY location"); 
     System.out.println("DB Connected"); 
     TmpSqlRs.first(); 

      do 
       { 
       String s= TmpSqlRs.getString("location"); 
       Cbx01.addItem(s); 
       CateId=TmpSqlRs.getInt("pincode"); 
       v1.addElement(s); 
       v.addElement(CateId); 
       Map.put(s, CateId); 
       Cbx01.addItemListener(new ItemListener() 
       { 
        public void itemStateChanged(ItemEvent e) { 
            if (e.getStateChange() == ItemEvent.SELECTED) { 
            Lbl01.setText(Map.get(Cbx01.getSelectedItem()).toString()); 
            } 
           } 

          }); 
     }while(TmpSqlRs.next()); 

    }catch(Exception e){ 
    System.out.println(e); 
    } 
    } 
private boolean hide_flag = false; 
     private void setModel(DefaultComboBoxModel mdl, String str) { 
     Cbx01.setModel(mdl); 
     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.addKeyListener(new java.awt.event.KeyAdapter() { 
      public void keyPressed(java.awt.event.KeyEvent evt) { 
       Cbx01KeyPressed(evt); 
      } 
      public void keyTyped(java.awt.event.KeyEvent evt) { 
       Cbx01KeyTyped(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(57, 57, 57) 
       .addComponent(Cbx01, javax.swing.GroupLayout.PREFERRED_SIZE, 107, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addGap(50, 50, 50) 
       .addComponent(Lbl01, javax.swing.GroupLayout.PREFERRED_SIZE, 109, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(77, Short.MAX_VALUE)) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGap(88, 88, 88) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
        .addComponent(Lbl01, javax.swing.GroupLayout.PREFERRED_SIZE, 22, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addComponent(Cbx01, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE)) 
       .addContainerGap(190, Short.MAX_VALUE)) 
     ); 

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

    private void Cbx01KeyPressed(java.awt.event.KeyEvent evt) { 
     //Txt01=(JTextField)Cbx01.getEditor().getEditorComponent(); 
    } 

    private void Cbx01KeyTyped(java.awt.event.KeyEvent evt) { 
     // TODO add your handling code here: 
    } 


    public static void main(String args[]) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       comboautosuggest Tmpcas=new comboautosuggest(); 
       Tmpcas.AutoSuggest(); 
       Tmpcas.setVisible(true); 
      } 
     }); 
    } 

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

} 

ответ

2

При загрузке записей из базы данных, которые вы делаете две вещи внутри while -loop:

  1. Добавить товар в JComboBox.
  2. Добавить ItemListener в JComboBox.

Это имеет два значения: сначала вы добавляете несколько прослушивателей элементов, а именно один для каждой записи. Всякий раз, когда вы меняете выбранное значение, все из них будут запускаться. Поскольку все они выполняют одно и то же действие, нет необходимости объявлять более одного. Переместите Cbx01.addItemListener(new ItemListener() { ... }); вне цикла.

Во-вторых, вы добавляете слушателя товаров после первого элемента. Поэтому добавление первого значения не может вызвать прослушиватель вообще, и, таким образом, не отображается id (он будет отображаться, если вы снова выбираете первый элемент с помощью мыши).

Предлагаю вам переместить addItemListener перед циклом. Хорошим местом будет то, что вы сами инициируете JComboBox.

+0

, хотя я перемещаю addItemListner перед циклом. он показывает ту же проблему. есть другое решение. любезно помогите мне решить эту проблему. – fernandas