java - 如何对 JTextArea 使用 KeyEventListener 并使用 Tab 自动完成列表中的单词

标签 java swing

我想从用户那里获取文本输入(来自 JTextArea)并根据预先存在的列表使用自动完成功能。

例如用户可以输入“London Vict”并按 TAB 键,然后完成伦敦维多利亚(这将包含在列表中)。

我正在努力取回用户的文本,我尝试将 KeyEventListener 添加到 JTextArea 但我没有运气。

请找到下面的代码:

package Main;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.Document;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.JTextArea;

public class View extends JFrame {

    private JPanel contentPane;

    /**
     * Launch the application.
     */

    Map.Entry<String, List<Integer> > entry = new MyEntry<String, List<Integer> >("London Victoria", new ArrayList<Integer>(Arrays.asList(1, 2)));

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    View frame = new View();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public View() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JTextArea StationDetails = new JTextArea();
        StationDetails.setText("Enter Undergound Name: ");
        StationDetails.setBounds(35, 19, 382, 232);
        //StationDetails.getDocument().addDocumentListener(new DocumentListener);
        contentPane.add(StationDetails);
    }

    final class MyEntry<K, V> implements Map.Entry<K, V> {
        private final K key;
        private V value;

        public MyEntry(K key, V value) {
            this.key = key;
            this.value = value;
        }

        @Override
        public K getKey() {
            return key;
        }

        @Override
        public V getValue() {
            return value;
        }

        @Override
        public V setValue(V value) {
            V old = this.value;
            this.value = value;
            return old;
        }
    }

}

包含所有电台名称的列表称为“条目”

感谢您的帮助

最佳答案

首先,变量名称不应以大写字符开头。大多数是正确的,但不是全部。保持一致!!!

User would type 'London Vict' and press TAB

Swing 组件使用Key BindingsAction 映射到KeyStroke

阅读Swing tutorial一些基础知识。有以下部分:

  1. 如何使用按键绑定(bind)
  2. 如何使用操作

您的键绑定(bind)代码将类似于:

JTextArea textArea = new JTextArea(3, 30);
InputMap im = textArea.getInputMap();
KeyStroke tab = KeyStroke.getKeyStroke("TAB");
textArea.getActionMap().put(im.get(tab), new TabAction(true));

你的 TabAction 会是这样的:

class TabAction extends AbstractAction
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        JTextArea textArea = (JTextArea)e.getSource();

        //  get the word at the caret
        //  lookup the full word
        //  replace current text with full word
    }
}

您可以使用Utilities类来帮助您获取要替换的文本的起始偏移量,然后使用JTextArea的replaceSelection方法来替换文本一旦你查找这个词。

关于java - 如何对 JTextArea 使用 KeyEventListener 并使用 Tab 自动完成列表中的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46792837/

相关文章:

java - 如何通过 API 从 JasperReport 对象(.jasper 编译文件)获取子报表名称?

java - Guice:测试和子项目中的不同绑定(bind)

Java 图形 JApplet

java - 需要帮助设置具有网格和可点击项目的 GUI

另一个类中的 Java ActionListener

java - 使用 Swift 启动轻量级 Web 服务器以在 iOS App 中接收 OAuth1.0 回调

java - 值 ="<%request.getParameter%>"不起作用

java - 如何使用 gradle 和 jlink 构建 Java 应用程序?

java - 如何在Java中向JFrame添加多个可拖动的图像?

java - 应用程序运行时更新 JComboBox