Java 几乎我有一个自动补全器JComboBox,几乎它';已经做了,但我错了
我知道这个问题可能在这个论坛上重复过,但在我选择问这个问题之前,我自己在互联网上搜索,几乎我的解决方案都完成了,但我的脸上有一堵墙,我无法继续。当许多人想要编写一个自动补全程序时,他们可能会遇到同样的问题,这可以解决所有人的问题 我的问题是。当我有了巧合列表时,我不知道如何更新DefaultComboxModel,因为我陷入了无限循环,因为我使用的是documentListener 代码如下: 主要代码:Java 几乎我有一个自动补全器JComboBox,几乎它';已经做了,但我错了,java,swing,autocomplete,jcombobox,Java,Swing,Autocomplete,Jcombobox,我知道这个问题可能在这个论坛上重复过,但在我选择问这个问题之前,我自己在互联网上搜索,几乎我的解决方案都完成了,但我的脸上有一堵墙,我无法继续。当许多人想要编写一个自动补全程序时,他们可能会遇到同样的问题,这可以解决所有人的问题 我的问题是。当我有了巧合列表时,我不知道如何更新DefaultComboxModel,因为我陷入了无限循环,因为我使用的是documentListener 代码如下: 主要代码: public class MainFrame extends JFrame{ publi
public class MainFrame extends JFrame{
public MainFrame(){
initFrame();
}
private void initFrame() {
setTitle("Auto Completer");
setSize(284 , 70 );;
setLocationRelativeTo(null);;
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
getContentPane().setLayout(new BorderLayout(0, 0));
GComboBox comboBox = new GComboBox();
comboBox.getData().add("George");
comboBox.getData().add("Michael");
comboBox.getData().add("Mike");
comboBox.getData().add("Tom");
comboBox.getData().add("Elvis");
comboBox.commitData();
getContentPane().add(comboBox, BorderLayout.NORTH);
}
public static void main(String[] args) {
new MainFrame().setVisible(true);
}
}
这是自动完成JComboBox
public class GComboBox extends JComboBox<String> {
private List<String> data = new ArrayList<String>();
private DefaultComboBoxModel<String> comboModel;
private JTextComponent editTextField;
private boolean loadFinished = false;
public GComboBox(){
setEditable(true);
initComponent();
}
public void commitData(){
Vector<String> vector = new Vector<String>();
for (int i = 0 ; i < data.size() ; i++){
vector.add(data.get(i));
}
comboModel = new DefaultComboBoxModel<String>(vector);
this.setModel(comboModel);
editTextField.setText("");
loadFinished = true;
}
private void initComponent() {
createDocumentListeners();
}
private void createDocumentListeners() {
editTextField = (JTextComponent)getEditor().getEditorComponent();
editTextField.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void changedUpdate(DocumentEvent e) {}
@Override
public void insertUpdate(DocumentEvent e) {
update();
}
@Override
public void removeUpdate(DocumentEvent e) {
update();
}
public void update(){
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
List<String> founds = getCoincidences(editTextField.getText());
//if all words was loaded in the combo
if ( loadFinished ){
setCoincidencesInModel(founds);
setPopupVisible(true);
System.out.println("Load finished");
}
//Here I can see the coincidences
for ( String itemFound : founds){
System.out.println("Words with coincidences -> " + itemFound);
}
}
});
}
});
}
public List<String> getCoincidences(String wordEntered){
List <String> newList = new ArrayList<String>();
for (int i = 0 ; i < data.size() ; i++){
if( data.get(i).contains(wordEntered)){
newList.add(data.get(i));
}
}
return newList;
}
public void setCoincidencesInModel(List<String> coincidenceList){
comboModel.removeAllElements();
Vector<String> vector = new Vector<String>();
for ( String coincidence : coincidenceList ){
comboModel.addElement(coincidence);
vector.add(coincidence);
}
DefaultComboBoxModel<String> newModel = new DefaultComboBoxModel<String>(vector);
setModel(newModel);
}
public List<String> getData() {
return data;
}
public void setData(List<String> data) {
this.data = data;
}
公共类GComboBox扩展了JComboBox{
私有列表数据=新的ArrayList();
私有DefaultComboxModel ComboxModel;
私有JTextComponent editTextField;
私有布尔loadFinished=false;
公共GComboBox(){
可编辑设置(真);
initComponent();
}
公共无效委员会数据(){
向量=新向量();
对于(int i=0;i”+itemFound);
}
}
});
}
});
}
公共列表GetConcurrence(输入字符串){
List newList=newarraylist();
对于(int i=0;i
}
我不知道如何更新DefaultComboBoxModel,因为我陷入了无限循环,因为我使用的是documentListener。
==mutableComboxModel,使用标准