gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:33:04 25 4
gpt4 key购买 nike

我想从用户那里获取文本输入(来自 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com