JComboBox AutoSuggestion с вектором - PullRequest
0 голосов
/ 24 января 2012

Я создал один comboBox. Я сохранил идентификатор, имя в БД и вызов из БД в JComboBox. Пока я выбираю элемент в JComboBox, он показывает соответствующий идентификатор в JLable. Для этого я использую вектор. Но я работаю с автоматическим предложением выбрать значение из "S", оно показывает тот же индекс (положение). Я хочу, чтобы соответствующий идентификатор с помощью getSelectedItem. Но это невозможно при использовании вектора, потому что если я использую вектор, он работает на GetSelectdindex, а не на getSelectedItem. Вместо вектора, что я могу использовать для этого. Как я могу решить эту проблему, пожалуйста, помогите мне.

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;
         String CateId;
         JTextField Txt01;
         TreeMap Map=new TreeMap();

    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{
                               //Cbx01.setModel(new DefaultComboBoxModel(v1.toArray()));
                                DefaultComboBoxModel m = getSuggestedModel(v1, text);
                               if(m.getSize()==0 ) {
                               Cbx01.hidePopup();
                                 }
                                else{
                                          setModel(m, text);
                                         Cbx01.showPopup();
                                     }
                                 }
                             }
                          });

                    }


      });
 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");
        TmpSqlRs.first();

     do
              {
                Cbx01.addItem(TmpSqlRs.getString("CateName"));
                int CateId=TmpSqlRs.getInt("CateId");
                v.addElement(CateId);
                v1.addElement(TmpSqlRs.getString("CateName"));


         Cbx01.addItemListener(new ItemListener() {
                                public void itemStateChanged(ItemEvent e) {
                                     if (e.getStateChange() == ItemEvent.SELECTED) {
                                  //   System.out.println(Cbx01.setSelectedIndex(1));
                                      Lbl01.setText(v.get( Cbx01.getSelectedIndex()).toString());
                                    //System.out.println(v.get( Cbx01.getSelectedIndex()).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;
    }
    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

}
/*class MyListRenderer extends JLabel implements ListCellRenderer {

    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        Object[] itemData = (Object[])value;
        setText((String)itemData[1]);

        return this;
    }
}*/

1 Ответ

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

1) не очень хорошая идея Открыть Connection во время EDT, Connection - это жесткая и длительная операция и Swing GUI зависание или безответственность до тех пор, пока не закончится этот запрос

2) ваш Connection, Resultset and Statement должен бытьзакрывается в блоке finally (try --> catch --> finally), иначе используемая память будет увеличиваться до невероятного значения, поскольку она остается в памяти JVM

3). Эта идея должна быть возможной, если вы перенаправили Connection, Resultset and Statement на фоновую задачу.например, SwingWorker или Runnable#Thread

4) все изменения на

  • ComboBoxModel

или

  • ComboBoxModel для JComboBox

должен быть заключен в invokeLater

5), если возможно, измените эту идею на Autocomplete JComboBox / JTextField

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...