基于JTextField过滤JList

2023-11-26

我的程序中有一个 JTextField 和一个 JList 。 JList 包含用户的联系人。我想根据 JTextField 上的文本过滤 JList。例如,如果我输入“Mike”,它只会显示包括“Mike”的联系人。当用户清除 JTextField 时,它将重置过滤器。

我知道我可以通过两个数组手动完成此操作。一份用于原始联系人,一份用于过滤后的联系人。当用户更改 JTextField 的值时,我将遍历原始列表,更新临时列表并更新 JList。我只是想知道是否有一些内置功能可以避免手工劳动。


执行此类操作的最佳方法是使用 ListModel 实现来过滤其内容。 我不知道任何默认过滤 ListModel 实现,但它应该不会太难做到。 这是一个快速而肮脏的解决方案,仅供您参考。您可能想为其添加更多附加功能。

package test;

import java.util.ArrayList;

import javax.swing.AbstractListModel;
import javax.swing.ListModel;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;

public class FilteredListModel extends AbstractListModel {
    public static interface Filter {
        boolean accept(Object element);
    }

    private final ListModel _source;
    private Filter _filter;
    private final ArrayList<Integer> _indices = new ArrayList<Integer>();

    public FilteredListModel(ListModel source) {
        if (source == null)
            throw new IllegalArgumentException("Source is null");
        _source = source;
        _source.addListDataListener(new ListDataListener() {
            public void intervalRemoved(ListDataEvent e) {
                doFilter();
            }

            public void intervalAdded(ListDataEvent e) {
                doFilter();
            }

            public void contentsChanged(ListDataEvent e) {
                doFilter();
            }
        });
    }

    public void setFilter(Filter f) {
        _filter = f;
        doFilter();
    }

    private void doFilter() {
        _indices.clear();

        Filter f = _filter;
        if (f != null) {
            int count = _source.getSize();
            for (int i = 0; i < count; i++) {
                Object element = _source.getElementAt(i);
                if (f.accept(element)) {
                    _indices.add(i);
                }
            }
            fireContentsChanged(this, 0, getSize() - 1);
        }
    }

    public int getSize() {
        return (_filter != null) ? _indices.size() : _source.getSize();
    }

    public Object getElementAt(int index) {
        return (_filter != null) ? _source.getElementAt(_indices.get(index)) : _source.getElementAt(index);
    }
}

为了使用它,您需要将其设置到 JList,然后根据需要调用 setFilter()。 这是一个例子:

    ListModel source = new DefaultListModel(); // use a model of your choice here;
    FilteredListModel filteredListModel = new FilteredListModel(source);
    JList list = new JList(filteredListModel);
    filteredListModel.setFilter(new FilteredListModel.Filter() {
        public boolean accept(Object element) {
            return false; // put your filtering logic here.
        }
    });

一旦调用 setFilter() 方法,屏幕上的 JList 就会相应地更改其内容。

或者,您可能希望为过滤器实现观察者/可观察模式,这样您就可以重新过滤列表,而无需调用方法 setFilter()。您可以稍后尝试一下。对于第一次迭代,只要每次用户在 JTextField 中键入内容时调用方法 setFilter 就足够了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于JTextField过滤JList 的相关文章

  • 模拟匿名函数

    我正在编写 jUnits 但被 Lambda 表达式困住了 有没有办法模拟匿名函数 return retryTemplate execute retryContext gt return mockedResponse 在上面的代码中 我试图
  • 如何在servlet 3.0的web.xml-less中定义

    我有现有的 web 应用程序 我想将其转换为 servlet 3 0 的 web xml less 我已经设法让它工作 但是 web xml 中有 2 个标签 我仍然不知道无 web xml 环境中的等效代码
  • Groovy 中的显式输入:有时还是从不?

    后来 仍然无法弄清楚 Groovy 是否具有静态类型 似乎没有 或者使用显式类型生成的字节码是否不同 似乎是 无论如何 回答这个问题 One of the main differences between Groovy and other
  • 如何使用流从两个列表或数组乘法中查找元素对

    我有两个数字列表 我想找到所有可能的数字对 例如 给定列表 1 2 3 and 3 4 结果应该是 1 3 1 4 2 3 2 4 3 3 3 4 我知道我可以使用for loop但有没有更简洁的方法来使用Java 8 流 我尝试了以下操作
  • Google 语音 API 凭据

    我正在尝试使用 Google Speech API 但从 Google Cloud 外部进行一些测试 在旧的测试版中 我能够指定凭据文件 但现在我无法在SpeechClient class 如何使用 Google Speech API Ja
  • ScrollPane滚动到底部问题

    我的 Java 应用程序中有 TextArea 并且我附加了很多文本行 我需要 ScrollPane 滚动到最后附加的 到 TextArea 的底部 我怎样才能做到这一点 您可以通过将插入符号位置移动到底部来做到这一点 这会自动滚动 Tex
  • 如何使用 spring data jpa 调用数据库函数?

    我想从 Spring Boot 应用程序调用数据库函数 该函数将返回解密的值 是否可以使用spring data jpa调用数据库函数 如果可以的话怎么办 如果无法使用 spring data jpa 是否有其他方法可以从 Spring B
  • Retrofit 2.0b2:如何从响应中获取InputStream?

    我正在使用 Retrofit 2 0b2 收到响应后 我尝试通过以下方式从响应中获取 InputStream Response
  • 如何解决找不到 com.google.cloud.Service 的类文件

    我正在尝试将 JSON 数据上传到 gcs 由于我之前没有使用谷歌云 所以我开始将随机字符串上传到 gcs 但在创建存储服务对象时我陷入了困境 Maven 依赖
  • 空手道弹簧整合

    我们有一个 Spring MVC 应用程序 是否可以在 Karate 中集成 spring 上下文 假设通过 Karate runner 绑定 SpringJunitRunner 或者通过 spring 上下文查找 bean 在空手道中一切
  • 配置 Restlet 以在 Google App Engine 上返回 JSP?

    我开发了一个 Restlet 应用程序 我想通过 Restlet 返回一个 URL 请求的 JSP 文件 在不使用重定向的情况下如何实现此目的 IE 假设我在 mydomain com 上有文件 contact jsp 并且我希望人们能够访
  • Java字符串模式识别

    我有一个大约一千个字符长的字符串 由 L T 和 A 组成 我很确定其中有一个简单的模式 我想知道是否有任何快速简便的方法可以找到它 该字符串会发生变化 因此这不仅仅是一次性的 我正在寻找的模式例如如果字符串是 LLLLLLLLAATAAL
  • 如何让按钮打开

    我有一个问题 当用户单击 发送 按钮时 我需要将电子邮件发送到我的按钮 我只想到达那里 当用户单击发送按钮时 该按钮已经知道我的电子邮件地址并自动将其发送到那里的电子邮件 到目前为止 我的电子邮件活动 java import android
  • 为什么在 GWT(或任何 Web 应用程序)中使用命令模式?

    根据这个视频 7 50 Google 建议在其请求处理 API 之上使用命令模式 还有一个看起来很有帮助的项目gwt 调度 http code google com p gwt dispatch 实现该模式 根据 gwt 调度我需要为每个命
  • 将 s:element 和 s:complexType 命名为相同的名称

    将 s element 和 s complexType 命名为相同名称是否合法 可以看到下面的代码 element和complextype具有完全相同的名称 这是 wsdl 文件的一大块
  • Android:上下文是否影响用于取消警报的filterEquals()?

    要取消闹钟 我使用alarmManager cancel pendingIntent 根据 Android 开发者的说法Removes any alarms with a matching Intent Any alarm of any t
  • 如何使用 Jackson 将列表内容序列化为平面 JSON 对象?

    给定以下 POJO public class City private String title private List
  • 扩展 Lombok 困难

    我想创建一个注释处理程序来扩展 Java 语言 然而 由于 SCL 文件的原因 我无法轻松做到这一点 我想知道 Lombok 开发人员是否故意让它变得如此困难 如果我尝试扩展 JavacAnnotationHandler 它无法在 lomb
  • 没有 WindowManager.LayoutParams.TYPE_PHONE 的粘性覆盖

    我所说的粘性是指一个不会通过调用启动器意图而关闭的窗口 intent addCategory Intent CATEGORY HOME 以前这是用完成的WindowManager LayoutParams TYPE PHONE 但此类型现已
  • 逆变方法参数类型

    wiki 逆变方法参数类型 https en wikipedia org wiki Covariance and contravariance 28computer science 29 Contravariant method argum

随机推荐