我怎么能用Swing实现自动完成?

时间:2009-01-27 22:07:17

标签: java swing autocomplete

我有兴趣在JFrame中提供自动完成框。触发机制将基于助记符(我认为),但我不确定将什么用于“自动完成框”(我希望在用户按下键时过滤结果)。

你会如何实现这个?某种JFrame,还是JPopupMenu?

我想知道这是如何实现的,所以请不要发布链接到可用的[J]组件。

8 个答案:

答案 0 :(得分: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

答案 1 :(得分:9)

有一个文本区域自动完成的示例 的 Sun's tutorials "Using Swing Components"

它是以文字处理器的方式完成的(没有弹出窗口,但是 建议的文本在光标前输入。

向下滚动到“另一个例子:TextAreaDemo”
蚂蚁点击了启动按钮!

答案 2 :(得分:7)

Here是您提出的弹出窗口示例。您可以在页面底部启动此示例。

这是我的简化示例。可悲的是,你必须先点击文本字段, 在开始输入之前,或者你会得到例外。 如果有人能弄清楚原因,请告诉我/更新此答案。

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
  }

}

答案 3 :(得分:3)

这篇文章使用了几个库:Adding Auto-Complete Support to Swing Comboboxes @ Java.net

答案 4 :(得分:3)

您可以使用此库: http://fifesoft.com/autocomplete/

答案 5 :(得分:1)

使用此

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);
                            }
                        };
                }
                ;
            });
    }
}

答案 6 :(得分:1)

您可以使用JEdit's textarea内置完成功能&语法高亮框架。

更重要的解决方案(从长远来看是好的)是使用NetBeans Platform

答案 7 :(得分:0)

我会添加一个actionListener,这样你就可以按下每个键。

然后你可以在后台进行搜索(另一个线程)