29

JFrame でオートコンプリート ボックスを提供することに興味があります。トリガーメカニズムはニーモニックに基づいていると思いますが(私はそう思います)、「オートコンプリートボックス」に何を使用すればよいかよくわかりません(ユーザーがキーを押すと結果がフィルタリングされるようにしたいと思います)。

これをどのように実装しますか?ある種の JFrame、または JPopupMenu ですか?

これがどのように実装されているか知りたいので、利用可能な [J]Components へのリンクを投稿しないでください。

4

8 に答える 8

13

SwingLabs で無料の AutoComplete コンポーネントを試してみてください。

http://swinglabs.org

編集: このサイトはhttp://java.net/projects/swinglabsに移動したようです

このコードを実装する方法の例が次の場所にあります。

http://download.java.net/javadesktop/swinglabs/releases/0.8/docs/api/org/jdesktop/swingx/autocomplete/package-summary.html

于 2009-01-27T22:31:20.907 に答える
10


Sun のチュートリアル "Using Swing Components"に、テキスト領域のオートコンプリートの例があります。

これはワード プロセッサのスタイルで行われます (ポップアップ
は表示されませんが、候補テキストがカーソルの前に入力されます)。

「別の例: TextAreaDemo」まで下にスクロールして
、起動ボタンを押してください。

于 2009-06-14T09:13:41.947 に答える
7

これが私の簡単な例です。残念ながら、入力を開始する前に、まずテキストフィールドをクリックする必要があります。そうしないと、例外が発生します。誰かが理由を理解できるなら、私に知らせてください/この答えを更新してください。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class _Autocompleter {

  private final static JPopupMenu textPopupMenu
      = new JPopupMenu("MENU") {

    {
      add(new JMenuItem("item 1"));
      add(new JMenuItem("item 2"));
      setFocusable(false);
    }

  };

  private final static KeyListener textInputListener
      = new KeyAdapter() {

    @Override
    public void keyTyped(KeyEvent e) {
      Point p = textInput.getCaret().getMagicCaretPosition();
      if (textPopupMenu.isVisible()) {
        SwingUtilities.convertPointToScreen(p, textInput);
        textPopupMenu.setLocation(p.x, p.y + 20);
      } else {
        textPopupMenu.show(textInput, p.x, p.y + 20);
      }
    }

  };

  private final static JTextArea textInput
      = new JTextArea("type something") {

    {
      addKeyListener(textInputListener);
      setCaretPosition(getText().length());
    }

  };

  private final static JFrame f = new JFrame("TEST") {

    {
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      add(textInput);

      setSize(400, 60);
      setLocationRelativeTo(null);
      setVisible(true);
    }

  };

  public static void main(String[] args)
      throws Exception {
        // YES, IT'S EMPTY !!!
        // It'll start anyway because of static initializers
  }

}
于 2009-06-14T09:27:05.767 に答える
3

これは、いくつかのライブラリを使用する優れた記事です。Swingコンボボックスへのオートコンプリートサポートの追加@ Java.net

于 2010-08-26T11:32:24.190 に答える
3

このライブラリを使用できます: http://fifesoft.com/autocomplete/

于 2010-09-21T09:06:16.480 に答える
1

組み込みの補完および構文強調表示フレームワークを備えたJEditのテキストエリアを使用できます。

より重い解決策(長期的には良い)は、NetBeansプラットフォームを使用することです。

于 2010-03-11T06:47:46.737 に答える
0

これを使って

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class Autocompleter2
{
    //~ Methods ------------------------------------------------------------------------------------

    public static void main(String[] args)
      throws Exception
    {
        // YES, IT'S EMPTY !!!
        // It'll start anyway because of static initializers
        SwingUtilities.invokeLater(new Runnable()
            {
                @Override
                public void run()
                {
                    final JPopupMenu textPopupMenu = new JPopupMenu("MENU")
                    {

                        {
                            add(new JMenuItem("item 1"));
                            add(new JMenuItem("item 2"));
                            setFocusable(false);
                        }
                    };

                    final JTextArea textInput = new JTextArea("type something la")
                    {

                        {
                            setCaretPosition(getText().length());
                        }
                    };

                    KeyListener textInputListener = new KeyAdapter()
                    {
                        @Override
                        public void keyTyped(KeyEvent e)
                        {
                            Point p = textInput.getCaret().getMagicCaretPosition();

                            if (textPopupMenu.isVisible())
                            {
                                SwingUtilities.convertPointToScreen(p, textInput);
                                textPopupMenu.setLocation(p.x, p.y + 20);
                            }
                            else
                            {
                                textPopupMenu.show(textInput, p.x, p.y + 20);
                            }
                        }
                    };

                    textInput.addKeyListener(textInputListener);
                    new JFrame("TEST")
                        {

                            {
                                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                                add(textInput);
                                setSize(400, 60);
                                setLocationRelativeTo(null);
                                setVisible(true);
                            }
                        };
                }
                ;
            });
    }
}
于 2009-08-21T21:06:47.667 に答える
0

各キーが押されたときに取得できるように、actionListener を追加します。

その後、バックグラウンドで検索を行うことができます (別のスレッド)

于 2009-01-27T22:13:57.870 に答える