Java 如何使用Swing实现自动完成?

Java 如何使用Swing实现自动完成?,java,swing,autocomplete,Java,Swing,Autocomplete,我感兴趣的是在JFrame中提供一个自动完成框。触发机制将基于助记符(我认为),但我不确定“自动完成框”使用什么(我希望在用户按键时过滤结果) 您将如何实现这一点?某种JFrame或JPOppMenu 我想知道这是如何实现的,所以请不要发布指向可用[J]组件的链接。我会添加一个actionListener,这样您可以在按下每个键时获得它 然后你可以在后台进行搜索(另一个线程)你可能想在SwingLabs上试用免费的自动完成组件 编辑:此网站似乎已移动 下面是如何在以下位置实现此代码的示例: 在

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

您将如何实现这一点?某种JFrame或JPOppMenu


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

我会添加一个actionListener,这样您可以在按下每个键时获得它


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

你可能想在SwingLabs上试用免费的自动完成组件

编辑:此网站似乎已移动

下面是如何在以下位置实现此代码的示例:



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

只需向下滚动到“另一个示例:TextAreaDemo”
蚂蚁按下发射按钮

是一个根据您的要求弹出的示例。您可以在页面底部启动此示例

下面是我的简化示例。遗憾的是,您必须先单击文本字段, 在开始键入之前,否则会出现异常。如果有人能找出原因,请告诉我/更新此答案

用这个

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);
                            }
                        };
                }
                ;
            });
    }
}
您可以与内置的补全和语法突出显示框架一起使用


一个更重的解决方案(从长远来看是好的)是使用。

这里有一篇很棒的文章,它使用了几个库:@Java.net

您可以使用这个库:

但是,您会将ActionListener添加到哪个组件?您将提供自动完成功能的组件。
DocumentListener
是自动完成
JTextField
的更好选项。请在获得解决方案后发布。另请参阅类似答案!我知道怎么回事了!1) 当文本字段为空时,忽略插入符号位置!2) 使用诸如UndoableEditListener之类的内容代替KeyListener。请注意,swinglabs站点现在显示为空。但是,有一个可以访问源的。此外,该项目似乎可以通过maven获得,如图所示。它也可以在maven Central上获得。到今天为止,链接已断开。链接再次工作。我认为甲骨文推翻了从sun.com URL中断转发的决定。链接被中断了!
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);
                            }
                        };
                }
                ;
            });
    }
}