JFrameにオートコンプリートボックスを提供することに興味があります。トリガーメカニズムはニーモニックに基づいていますが(私は思う)、「オートコンプリートボックス」に何を使用するかはよくわかりません(ユーザーがキーを押したときに結果をフィルタリングしたい)。
これをどのように実装しますか?ある種のJFrame、またはJPopupMenu?
これがどのように実装されているか知りたいので、利用可能な[J]コンポーネントへのリンクを投稿しないでください。
にテキスト領域のオートコンプリートの例があります
Sunのチュートリアル「Swingコンポーネントの使用」。
これはワードプロセッサのスタイルで行われます(ポップアップはありませんが、
推奨テキストはカーソルの前に入力されます)。
"別の例:TextAreaDemo"まで下にスクロールするだけです
起動ボタンを押してください!
SwingLabsで無料のオートコンプリートコンポーネントを試してみることをお勧めします。
編集:このサイトは移動したようです http://Java.net/projects/swinglabs
このコードを実装する方法の例は次の場所にあります。
ここ はあなたが要求したポップアップの例です。この例は、ページの下部で起動できます。
これが私の簡単な例です。残念ながら、入力を開始する前に、まずテキストフィールドをクリックする必要があります。そうしないと、例外が発生します。 誰かが理由を理解できるなら、私に知らせてください/この答えを更新してください。
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
}
}
これは、いくつかのライブラリを使用するすばらしい記事です。 Swingコンボボックスへのオートコンプリートサポートの追加 @ Java.net
このライブラリを使用できます: http://fifesoft.com/autocomplete/
JEditのtextarea を、組み込みの補完および構文強調表示フレームワークとともに使用できます。
より重い解決策(長期的には良い)は、 NetBeans Platform を使用することです。
これを使って
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);
}
};
}
;
});
}
}
ActionListenerを追加して、押されたときに各キーを取得できるようにします。
その後、バックグラウンドで検索を実行できます(別のスレッド)