使用以下程序从我的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
}
答案 0 :(得分:2)
当您从数据库加载记录时,您在while
循环中执行两项操作:
JComboBox
。ItemListener
添加到JComboBox
。这有两个含义:首先,您要添加多个项侦听器,即每个记录一个。每当您更改所选值时,都会触发所有这些值。由于它们都执行相同的操作,因此不必声明多个。将Cbx01.addItemListener(new ItemListener() { ... });
移到循环外。
其次,在第一个项目本身之后添加项目监听器。因此,添加第一个值根本无法触发侦听器,因此不会显示任何ID(如果您再次使用鼠标选择第一个项目,则会显示该ID)。
我建议你在循环之前移动addItemListener
。一个好地方就是你实现JComboBox
本身的地方。