我正在尝试使用 JTextField 进行动态搜索,也就是说,每次我敲击一个键时我都需要查询一个对象列表(例如,我按下“A”并获取包含一个“A”,然后我添加一个“l”,所有没有“Al”的条目都被过滤掉,然后是“Ali”,“Alic”,最后“爱丽丝”)。我真的不需要将键与任何特定操作相关联,所以我的问题是:使用 KeyListener 来涵盖此功能是否足够?
我实际上不会使用这些工具中的任何一个。有一个定制的工具可以完全按照您所说的进行操作。它被称为DocumentListener。
这是一个演示代码。
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
public class DocumentListenerExample
{
public static void main(String[] args)
{
JFrame frame = new JFrame();
frame.setSize(500, 500);
frame.setLocationByPlatform(true);
JTextField field = new JTextField();
Document doc = field.getDocument();
doc.addDocumentListener(
new DocumentListener()
{
public void changedUpdate(DocumentEvent e) {}
public void removeUpdate(DocumentEvent e) {}
public void insertUpdate(DocumentEvent e)
{
try
{
System.out.println(e.getDocument().getText(e.getOffset(), e.getLength()));
}
catch (Exception exception)
{
System.err.println(exception);
}
}
}
);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(field);
frame.setVisible(true);
}
}
我从我的JTextField中提取了Document,然后我向它添加了一个匿名的DocumentListener,它的DocumentListener::insertUpdate方法只打印出刚刚使用Document::getText插入的字符串, DocumentEvent::getOffset, 和 DocumentEvent::getLength.
出于您的目的,您可能只想获取所有文本,而不只是刚刚插入的字符串。但无论如何,这为您提供了一个关于如何做到这一点的不错的概念证明。