将数据库中的值检索到组合框中

时间:2012-01-21 15:13:13

标签: java swing combobox jcombobox

使用以下程序从我的sql数据库中检索值到combobox.if我使用ResultSet从mysql数据库中选择JComboBox中的第一项,它没有显示第一个项目名称的id值。如果我在组合框中选择了第二项(结果集) 它显示第二个选定项目名称的id值。在我点击第一个项目之后,它会在标签框中显示第一个项目Id值。我的问题是第一个项目名称没有在标签框中显示ID值,这意味着我的第一个记录集值没有显示id值?

 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

}

1 个答案:

答案 0 :(得分:2)

当您从数据库加载记录时,您在while循环中执行两项操作:

  1. 将项目添加到JComboBox
  2. ItemListener添加到JComboBox
  3. 这有两个含义:首先,您要添加多个项侦听器,即每个记录一个。每当您更改所选值时,都会触发所有这些值。由于它们都执行相同的操作,因此不必声明多个。将Cbx01.addItemListener(new ItemListener() { ... });移到循环外。

    其次,在第一个项目本身之后添加项目监听器。因此,添加第一个值根本无法触发侦听器,因此不会显示任何ID(如果您再次使用鼠标选择第一个项目,则会显示该ID)。

    我建议你在循环之前移动addItemListener。一个好地方就是你实现JComboBox本身的地方。