KeyListener VS 键绑定 JField

问题描述 投票:0回答:1

我正在尝试使用 JTextField 进行动态搜索,也就是说,每次我敲击一个键时我都需要查询一个对象列表(例如,我按下“A”并获取包含一个“A”,然后我添加一个“l”,所有没有“Al”的条目都被过滤掉,然后是“Ali”,“Alic”,最后“爱丽丝”)。我真的不需要将键与任何特定操作相关联,所以我的问题是:使用 KeyListener 来涵盖此功能是否足够?

java swing keylistener key-bindings
1个回答
0
投票

我实际上不会使用这些工具中的任何一个。有一个定制的工具可以完全按照您所说的进行操作。它被称为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.

出于您的目的,您可能只想获取所有文本,而不只是刚刚插入的字符串。但无论如何,这为您提供了一个关于如何做到这一点的不错的概念证明。

© www.soinside.com 2019 - 2024. All rights reserved.