Получить значение из базы данных в выпадающий список - PullRequest
0 голосов
/ 21 января 2012

Я использую следующую программу для извлечения значения из моей базы данных sql в combobox.Если я выбираю первый элемент в JComboBox из базы данных mysql с помощью ResultSet, в нем не отображается значение 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 Ответ

2 голосов
/ 21 января 2012

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

  1. Добавить элемент в JComboBox.
  2. ДобавитьItemListener к JComboBox.

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

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

Я предлагаю переместить addItemListener допетля.Хорошее место было бы для того, чтобы вы сами создали JComboBox.

...