Java 具有从mysql数据库检索值的自动建议组合框
我正在使用以下java程序从mysql数据库中检索自动建议组合框的值。自动建议工作正常。如果我在组合框中键入“A”,则表示列表将显示以“A”开头的所有名称。我以该形式添加标签。如果我在组合框中选择一个名称,则表示相应的Id将显示在列表中标签。我的问题是,我的Sql数据库表中有以“A”开头的四个名称,如果我选择“A”开头的名称将显示正确的Id。但我清除组合框文本列并键入“B”意味着它显示以“B”开头的所有名称,但如果我单击“B”开头的名称,则无法显示正确的Id,它显示“A”起始名称的ID。因为我使用getSelectedIndex()获取ID。如何在自动建议组合框中为所有名称获取正确的IDJava 具有从mysql数据库检索值的自动建议组合框,java,swing,combobox,jcombobox,Java,Swing,Combobox,Jcombobox,我正在使用以下java程序从mysql数据库中检索自动建议组合框的值。自动建议工作正常。如果我在组合框中键入“A”,则表示列表将显示以“A”开头的所有名称。我以该形式添加标签。如果我在组合框中选择一个名称,则表示相应的Id将显示在列表中标签。我的问题是,我的Sql数据库表中有以“A”开头的四个名称,如果我选择“A”开头的名称将显示正确的Id。但我清除组合框文本列并键入“B”意味着它显示以“B”开头的所有名称,但如果我单击“B”开头的名称,则无法显示正确的Id,它显示“A”起始名称的ID。因为我使
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;
int CateId;
JTextField Txt01;
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{
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);
// setModel(getSuggestedModel(v1, text), 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))
{
// Cbx01.setSelectedIndex(-1);
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 CateId,CateName FROM Cust_Masterrecord ORDER BY CateName");
System.out.println("DB Connected");
Cbx01.removeAllItems();
TmpSqlRs.first();
if (Cbx01.getItemCount() == 0)
{
//Cbx01.addItem("");
do
{
// String s= TmpSqlRs.getString("CateName");
Cbx01.addItem(TmpSqlRs.getString("CateName"));
CateId=TmpSqlRs.getInt("CateId");
v.add(CateId);
// s.valueOf(CateId);
// System.out.println(s.valueOf(CateId));
// System.out.println(CateId);
// for(int i=0;i<CateName.length;i++){
v1.addElement(TmpSqlRs.getString("CateName"));
//}
Cbx01.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
//Cbx01.getItemCount();
//System.out.println(Cbx01.getItemCount());
//Cbx01.getSelectedItem();
//System.out.println(Cbx01.getSelectedItem());
Cbx01.getSelectedIndex();
//System.out.println( Cbx01.getSelectedIndex());
Lbl01.setText(v.get( Cbx01.getSelectedIndex()).toString());
//System.out.println(v.get( Cbx01.getSelectedIndex()).toString());
}
}
});
}while(TmpSqlRs.next());
}else{Cbx01.addItem("Records Not Available");}
}catch(Exception e){
System.out.println(e);
}
}
private boolean hide_flag = false;
private void setModel(DefaultComboBoxModel mdl, String str) {
Cbx01.setModel(mdl);
//Cbx01.setSelectedIndex(-1);
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.addPopupMenuListener(new javax.swing.event.PopupMenuListener() {
public void popupMenuCanceled(javax.swing.event.PopupMenuEvent evt) {
}
public void popupMenuWillBecomeInvisible(javax.swing.event.PopupMenuEvent evt) {
Cbx01PopupMenuWillBecomeInvisible(evt);
}
public void popupMenuWillBecomeVisible(javax.swing.event.PopupMenuEvent evt) {
Cbx01PopupMenuWillBecomeVisible(evt);
}
});
Cbx01.addComponentListener(new java.awt.event.ComponentAdapter() {
public void componentMoved(java.awt.event.ComponentEvent evt) {
Cbx01ComponentMoved(evt);
}
});
Cbx01.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
Cbx01ItemStateChanged(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(49, 49, 49)
.addComponent(Cbx01, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(45, 45, 45)
.addComponent(Lbl01, javax.swing.GroupLayout.PREFERRED_SIZE, 122, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(103, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(110, 110, 110)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(Cbx01, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(Lbl01, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(170, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
private void Cbx01ItemStateChanged(java.awt.event.ItemEvent evt) {
//Lbl01.setText(v.get( Cbx01.getSelectedIndex()).toString()); // TODO add your handling code here:
}
private void Cbx01ComponentMoved(java.awt.event.ComponentEvent evt) {
//Lbl01.setText(v.get( Cbx01.getSelectedIndex()).toString()); // TODO add your handling code here:
}
private void Cbx01PopupMenuWillBecomeVisible(javax.swing.event.PopupMenuEvent evt) {
// Lbl01.setText(v.get( Cbx01.getSelectedIndex()).toString()); // TODO add your handling code here:
}
private void Cbx01PopupMenuWillBecomeInvisible(javax.swing.event.PopupMenuEvent evt) {
// Lbl01.setText(v.get( Cbx01.getSelectedIndex()).toString()); // TODO add your handling code here:
}
/**
* @param args the command line arguments
*/
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
}
包组合;
导入java.sql.*;
导入java.awt.*;
导入java.awt.event.*;
导入java.util.*;
导入javax.swing.*;
公共类comboauto扩展javax.swing.JFrame{
向量v=新向量();
向量v1=新向量();
报表TMPSQLSTNT;
结果设置TmpSqlRs;
连接con;
内链;
JTextField Txt01;
公共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),“”);
}
否则{
DefaultComboxModel m=getSuggestedModel(v1,文本);
如果(m.getSize()==0){
Cbx01.hidePopup();
}
否则{
setModel(m,text);
Cbx01.showPopup();
}
}
}
});
}
按下公共无效键(按键事件e)
{
String text=Txt01.getText();
int code=e.getKeyCode();
if(code==KeyEvent.VK_ENTER){
如果(!v1.contains(text)){
v1.附录(文本);
//setModel(getSuggestedModel(v1,文本),文本);
}
hide_flag=true;
}else if(code==KeyEvent.VK_ESCAPE){
hide_flag=true;
}else if(code==KeyEvent.VK_RIGHT){
对于(int i=0;i您可以将对象添加到组合框中,而不是添加字符串。该对象可以同时包含名称和id,请确保它具有返回名称的字符串方法。然后您可以通过在组合框上调用getSelectedItem返回所选对象。替换执行while
(while(TmpSqlRs.next());
)使用while
并检查输出是否正确…否如果我使用while条件,则输出是否正确。哪些输出不正确?我认为您在B中获得了一个ID,就像do
为B执行时一样,它也有A
列表…同样的问题再次出现在Well使用'Cbx01.removeAllItems()“在中执行并检查…我认为这将解决问题…在进入循环之前忘记清除v
和v1
?似乎您只需要名称…字符串x=JComboBox.getSelectedItem();然后轮询数据库以获取所需的ID。或者,使用与组合框相同的方法索引ID创建一个数组。如何创建包含名称和ID的对象?它是这样的:公共类MenuItemData{private int ID;private String name;…(get/set方法)public String toString(){return this.name;}