作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想从用户那里获取文本输入(来自 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 Bindings
将Action
映射到KeyStroke
。
阅读Swing tutorial一些基础知识。有以下部分:
您的键绑定(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/
我是一名优秀的程序员,十分优秀!