Java 带向量的JComboBox自动建议

Java 带向量的JComboBox自动建议,java,mysql,swing,Java,Mysql,Swing,我创建了一个组合框,将id、名称存储在DB中,并从DB调用JComboBox。当我在JComboBox中选择on项时,它会在JLable中显示相应的id。为此,我使用向量。但是我正在使用自动建议从“S”中选择一个值,它显示相同的索引(位置)。我希望使用getSelectedItem获得相应的id。但使用vector是不可能的,因为如果我使用vector,它对GetSelectdindex有效,而对getSelectedItem无效。而不是向量,我可以用它。我怎样才能解决这个问题?请帮助我 pac

我创建了一个组合框,将id、名称存储在DB中,并从DB调用JComboBox。当我在JComboBox中选择on项时,它会在JLable中显示相应的id。为此,我使用向量。但是我正在使用自动建议从“S”中选择一个值,它显示相同的索引(位置)。我希望使用getSelectedItem获得相应的id。但使用vector是不可能的,因为如果我使用vector,它对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;
    }
}*/
包组合;
导入java.sql.*;
导入java.awt.*;
导入java.awt.event.*;
导入java.util.*;
导入javax.swing.*;
公共类comboauto扩展javax.swing.JFrame{
向量v=新向量();
向量v1=新向量();
报表TMPSQLSTNT;
结果设置TmpSqlRs;
连接con;
弦链;
JTextField Txt01;
TreeMap Map=newtreemap();
公共comboauto(){
初始化组件();
}
public void AutoSuggest(){
Txt01=(JTextField)Cbx01.getEditor().getEditorComponent();
addKeyListener(新的KeyAdapter(){
public void keyTyped(KeyEvent e)
{
invokeLater(新的Runnable()
{
公开募捐{
字符串text=Txt01.getText().toUpperCase();
如果(text.length()==0)
{
Cbx01.hidePopup();
setModel(新的DefaultComboxModel(v1),“”);
}
否则{
//Cbx01.setModel(新的DefaultComboxModel(v1.toArray());
DefaultComboxModel m=getSuggestedModel(v1,文本);
如果(m.getSize()==0){
Cbx01.hidePopup();
}
否则{
setModel(m,text);
Cbx01.showPopup();
}
}
}
});
}
});
试一试{
Class.forName(“com.mysql.jdbc.Driver”);
con=DriverManager.getConnection(“jdbc:mysql://localhost:3306/project“,”根“,”根“);
TmpSqlStmnt=con.createStatement();
TmpSqlRs=TmpSqlStmnt.executeQuery(“按CateName从客户主记录订单中选择CateId、CateName”);
System.out.println(“DB连接”);
TmpSqlRs.first();
做
{
Cbx01.addItem(TmpSqlRs.getString(“CateName”);
int CateId=TmpSqlRs.getInt(“CateId”);
v、 附加元素(CateId);
v1.addElement(TmpSqlRs.getString(“CateName”);
Cbx01.addItemListener(新的ItemListener(){
公共无效itemStateChanged(ItemEvent e){
如果(如getStateChange()==ItemEvent.SELECTED){
//系统输出打印LN(Cbx01.setSelectedIndex(1));
Lbl01.setText(v.get(Cbx01.getSelectedIndex()).toString());
//System.out.println(v.get(Cbx01.getSelectedIndex()).toString());
}
}
});
}while(TmpSqlRs.next());
}捕获(例外e){
系统输出打印ln(e);
}
}
私有布尔隐藏标志=false;
私有void setModel(defaultComboboxModelMDL,String str)
{
Cbx01.setModel(mdl);
Txt01.setText(str);
}
私有静态DefaultComboxModel getSuggestedModel(java.util.List列表,字符串文本){
DefaultComboxModel m=新的DefaultComboxModel();
用于(字符串s:列表){
如果(以(文本)开头)m.附录;
}
返回m;
}
公共静态void main(字符串参数[]){
invokeLater(new Runnable()){
公开募捐{
comboauto Tmpobj1=新comboauto();
Tmpobj1.AutoSuggest();
Tmpobj1.setVisible(true);
}
});
}
//变量声明-不修改
私有javax.swing.jcombox Cbx01;
私有javax.swing.JLabel Lbl01;
//变量结束声明
}
/*类MyListRenderer扩展JLabel实现ListCellRenderer{
@凌驾
公共组件getListCellRenderComponent(JList列表、对象值、int索引、布尔isSelected、布尔cellHasFocus){
对象[]项数据=(对象[])值;
setText((字符串)itemData[1]);
归还这个;
}
}*/
1)不好的主意打开
连接
在EDT过程中,
连接
是一个困难且长时间的操作,并且
Swing GUI
冻结或不响应,直到此taks结束

2) 必须在
finally
块(
try-->catch-->finally
)中关闭
连接、结果集和语句,否则您的已用内存将增加到无法交付的数量,因为它们将留在JVM内存中

3) 如果您将
连接、结果集和语句导入后台任务,例如
SwingWorker
Runnable#Thread

4) 对

  • 组合箱模型

  • JComboBox
必须包装到
invokeLater


5) 如果可能的话,将这个想法改为

,请学习java命名约定并坚持它们