-2

友人、このプロジェクトでは、ユーザーが入力するリストの提案が必要です。私は多くの例を見て、それに取り組み始めました。問題は、入力された最初の文字の提案のみが表示され、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;
 }

入力時にオートコンプリートで単語を提案できるようにしたい。最初の文字だけではありません。

4

1 に答える 1

0

「いくつかの例を教えてください」

車輪を再発明しないでください。すでに非常に多くの実装があります。Google検索を行うだけです。ここにカップルがあります

スウィングX

Maven の依存関係

    <dependency>
        <groupId>org.swinglabs</groupId>
        <artifactId>swingx</artifactId>
        <version>1.6.1</version>
    </dependency>

ここに画像の説明を入力

import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import org.jdesktop.swingx.autocomplete.AutoCompleteDecorator;

public class SwingXDemo {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JComboBox comboBox;
                comboBox = new JComboBox(new Object[]{"Ester", "Jordi",
                    "Jordina", "Jorge", "Sergi"});
                AutoCompleteDecorator.decorate(comboBox);
                System.out.println("Is editable - "
                        + comboBox.isEditable() + ". Surprise!");
                JOptionPane.showMessageDialog(null, comboBox);
            }

        });
    }
}

ジデ

Maven の依存関係

    <dependency>
        <groupId>com.jidesoft</groupId>
        <artifactId>jide-oss</artifactId>
        <version>3.5.13</version>
    </dependency>

ここに画像の説明を入力

com.jidesoft.swing.AutoCompletionComboBox をインポートします。

import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

public class JIDEDemo {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                AutoCompletionComboBox comboBox;
                Object[] elements = new Object[]{"Ester", "Jordi", "Jordina",
                    "Jorge", "Sergi"};
                comboBox = new AutoCompletionComboBox(elements);
                comboBox.setStrict(false);

                JOptionPane.showMessageDialog(null, comboBox);
            }
        });
    }
}
于 2014-02-26T03:08:57.813 に答える