友人、このプロジェクトでは、ユーザーが入力するリストの提案が必要です。私は多くの例を見て、それに取り組み始めました。問題は、入力された最初の文字の提案のみが表示され、2 番目の文字が入力されると提案が消えることです。理由を理解するのを手伝ってください。私のコードは、右矢印キーが押されたときにリストの最初のオプションでオートコンプリートされるように書かれています。
Vector<String> v = new Stack<String>();
public JTextField tx;
private boolean hide_flag = false;
tx = (JTextField)name.getEditor().getEditorComponent();
tx.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e){
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
String text = tx.getText().toUpperCase();
if(text.length()==0){
name.hidePopup();
setModel(new DefaultComboBoxModel(v),"");
}
else{
DefaultComboBoxModel m = getSuggestedModel(v,text);
if(m.getSize()==0){
name.hidePopup();
}
else{
setModel(m,text);
name.showPopup();
}
}
}
});
}
@Override
public void keyPressed(KeyEvent evt){
String text = tx.getText();
int code = evt.getKeyCode();
if(code == KeyEvent.VK_ENTER){
if(!v.contains(text)){
v.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< v.size();i++){
String str = (String)v.elementAt(i);
if(str.startsWith(text)){
tx.setText(str);
return;
}}
}
}
});
}
private void setModel(DefaultComboBoxModel Mdl, String str) {
name.setModel(Mdl);
tx.setText(str);
}
private DefaultComboBoxModel getSuggestedModel(List<String> list , String text){
DefaultComboBoxModel m = new DefaultComboBoxModel();
for(String s : list){
if(s.startsWith(text)){
m.addElement(s);
}
}
return m;
}
入力時にオートコンプリートで単語を提案できるようにしたい。最初の文字だけではありません。