gpt4 book ai didi

java - 带 vector 的 JComboBox AutoSuggestion

转载 作者:行者123 更新时间:2023-11-29 08:59:50 24 4
gpt4 key购买 nike

我创建了一个组合框,我将ID、名称存储在数据库中,并从数据库调用JComboBox。当我在 JComboBox 中选择项目时,它会在 JLable 中显示相应的 id。为此,我使用 vector 。但我正在使用自动建议从“S”中选择一个值,它显示相同的索引(位置)。我想要使​​用 getSelectedItem 获得相应的 id。但使用 vector 是不可能的,因为如果我使用 vector ,它适用于 GetSelectdindex 而不适用于 getSelectedItem。我可以用什么来代替 vector 。我该如何解决这个问题,请帮助我。

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) 不是个好主意在 EDT 期间打开 ConnectionConnection 是一项困难且长时间的操作,并且 Swing GUI 会卡住或在此之前不负责任任务结束

2) 您的连接、结果集和语句必须在finally block 中关闭(try --> catch --> finally),否则你使用的内存将增加到令人难以置信的数量,因为停留在 JVM 内存中

3) 如果您将连接、结果集和语句直接定向到后台任务,那么这个想法应该是可能的。 SwingWorkerRunnable#Thread

4)所有更改

  • 组合框模型

  • ComboBoxModel 切换为 JComboBox

必须包含在 invokeLater

5) 如果可能的话,将此想法更改为 Autocomplete JComboBox / JTextField

关于java - 带 vector 的 JComboBox AutoSuggestion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8984027/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com