JavaFX TableView筛选与搜索结果动态获取教程

JavaFX TableView筛选与搜索结果动态获取教程

本教程详细讲解如何在javafx应用中实现tableview的数据筛选功能,并通过文本输入框和按钮交互,动态获取筛选后的数据。文章将涵盖filteredlist和sortedlist的使用、文本监听器实现实时筛选,以及在按钮点击事件中准确获取当前tableview中显示的数据项,并探讨如何将这些数据传递给其他fxml视图进行进一步处理。

在JavaFX应用程序中,TableView 是一个功能强大的组件,常用于展示大量结构化数据。当数据量较大时,提供搜索和筛选功能可以极大地提升用户体验。本教程将指导您如何结合 TextField 和 Button,实现对 TableView 数据的动态筛选,并在用户点击搜索按钮后,获取并处理筛选后的结果。

核心概念:JavaFX TableView的筛选机制

JavaFX提供了一套灵活的机制来管理和筛选 TableView 的数据。主要涉及到以下几个关键类:

ObservableList: 存储 TableView 的原始数据。任何对该列表的修改都会自动反映在 TableView 上。FilteredList: 包装一个 ObservableList,并根据一个 Predicate 对象来过滤数据。当 Predicate 发生变化时,FilteredList 会自动更新其内容。SortedList: 包装一个 FilteredList (或任何 ObservableList),并根据 TableView 的排序规则来排序数据。它允许用户通过点击列头进行排序。

通过将 FilteredList 绑定到 TextField 的文本变化监听器上,我们可以实现实时搜索功能。

准备工作:FXML布局与控制器骨架

首先,我们需要一个包含 TableView、TextField 和 Button 的FXML布局文件。

立即学习“Java免费学习笔记(深入)”;

                                                            

接下来,是对应的控制器骨架和数据模型。

package com.example;import javafx.collections.FXCollections;import javafx.collections.ObservableList;import javafx.collections.transformation.FilteredList;import javafx.collections.transformation.SortedList;import javafx.event.ActionEvent;import javafx.fxml.FXML;import javafx.fxml.Initializable;import javafx.scene.control.Button;import javafx.scene.control.TableColumn;import javafx.scene.control.TableView;import javafx.scene.control.TextField;import javafx.scene.control.cell.PropertyValueFactory;import java.net.URL;import java.util.ResourceBundle;import java.util.function.Predicate;public class TableController implements Initializable {    @FXML    private TableView mTableView;    @FXML    private TableColumn idColumn;    @FXML    private TableColumn nameColumn;    @FXML    private TableColumn salColumn; // 假设Salary是Double类型    @FXML    private TextField mTextField;    @FXML    private Button searchBtn;    private ObservableList mList = FXCollections.observableArrayList();    private FilteredList filteredList;    private SortedList sortedList;    @Override    public void initialize(URL url, ResourceBundle resourceBundle) {        // 初始化列的单元格值工厂        idColumn.setCellValueFactory(new PropertyValueFactory("id"));        nameColumn.setCellValueFactory(new PropertyValueFactory("name"));        salColumn.setCellValueFactory(new PropertyValueFactory("salary"));        // 模拟加载数据        loadRecords();        // 初始化FilteredList和SortedList        filteredList = new FilteredList(mList, b -> true); // 初始显示所有数据        sortedList = new SortedList(filteredList);        sortedList.comparatorProperty().bind(mTableView.comparatorProperty()); // 绑定排序属性        mTableView.setItems(sortedList); // 将排序列表设置给TableView        // 添加TextField的文本变化监听器,实现实时筛选        mTextField.textProperty().addListener((observable, oldValue, newValue) -> {            filteredList.setPredicate(createSearchPredicate(newValue));        });    }    /**     * 模拟从数据库或其他源加载数据     */    private void loadRecords() {        mList.add(new Employee(101, "Alice", 5000.0));        mList.add(new Employee(102, "Bob", 6000.0));        mList.add(new Employee(103, "Charlie", 7500.0));        mList.add(new Employee(104, "David", 4500.0));        mList.add(new Employee(201, "Eve", 8000.0));        mList.add(new Employee(202, "Frank", 9000.0));    }    /**     * 根据搜索关键字创建Predicate     * @param searchText 搜索文本     * @return Predicate     */    private Predicate createSearchPredicate(String searchText) {        return employee -> {            // 如果搜索文本为空,显示所有数据            if (searchText == null || searchText.isEmpty() || searchText.isBlank()) {                return true;            }            String lowerCaseSearchText = searchText.toLowerCase();            // 检查员工ID是否包含搜索关键字            if (String.valueOf(employee.getId()).toLowerCase().contains(lowerCaseSearchText)) {                return true;            }            // 检查员工姓名是否包含搜索关键字            if (employee.getName().toLowerCase().contains(lowerCaseSearchText)) {                return true;            }            // 可以添加更多字段的检查,例如薪水            // if (String.valueOf(employee.getSalary()).toLowerCase().contains(lowerCaseSearchText)) {            //     return true;            // }            return false; // 不匹配        };    }    @FXML    public void handleSearch(ActionEvent event) {        // 此方法将在下面详细实现    }}

Employee数据模型:

package com.example;import javafx.beans.property.*;public class Employee {    private final IntegerProperty id;    private final StringProperty name;    private final DoubleProperty salary;    public Employee(int id, String name, double salary) {        this.id = new SimpleIntegerProperty(id);        this.name = new SimpleStringProperty(name);        this.salary = new SimpleDoubleProperty(salary);    }    public int getId() {        return id.get();    }    public IntegerProperty idProperty() {        return id;    }    public void setId(int id) {        this.id.set(id);    }    public String getName() {        return name.get();    }    public StringProperty nameProperty() {        return name;    }    public void setName(String name) {        this.name.set(name);    }    public double getSalary() {        return salary.get();    }    public DoubleProperty salaryProperty() {        return salary;    }    public void setSalary(double salary) {        this.salary.set(salary);    }}

获取筛选后的数据:按钮点击事件处理

当用户在 TextField 中输入搜索词并点击“搜索”按钮时,我们通常希望获取当前 TableView 中显示(即已经过筛选和排序)的数据。

纳米搜索 纳米搜索

纳米搜索:360推出的新一代AI搜索引擎

纳米搜索 30 查看详情 纳米搜索

关键在于 mTableView.getItems() 方法。无论 TableView 绑定的是原始 ObservableList、FilteredList 还是 SortedList,mTableView.getItems() 总是返回当前 TableView 实际显示的数据列表。因此,如果您的 TableView 已经绑定了 SortedList(它又包装了 FilteredList),那么 getItems() 返回的就是经过筛选和排序后的数据。

在 handleSearch 方法中,您可以这样获取数据:

    @FXML    public void handleSearch(ActionEvent event) {        // 获取当前TableView中显示的所有数据项        ObservableList currentDisplayedEmployees = mTableView.getItems();        if (currentDisplayedEmployees.isEmpty()) {            System.out.println("没有找到匹配的员工。");            // 可以显示一个提示信息给用户            // Alert alert = new Alert(Alert.AlertType.INFORMATION, "没有找到匹配的员工!");            // alert.showAndWait();        } else {            // 假设我们只关心第一个匹配项            Employee firstResult = currentDisplayedEmployees.get(0);            System.out.println("搜索结果的第一个员工ID: " + firstResult.getId() + ", 姓名: " + firstResult.getName());            // 如果需要,您可以遍历所有结果            // for (Employee emp : currentDisplayedEmployees) {            //     System.out.println("匹配员工: " + emp.getName());            // }            // 进一步处理:例如,加载另一个FXML并传递这个员工对象            // loadAnotherFxml(firstResult);        }    }

数据传递与多FXML场景

在实际应用中,您可能需要将筛选出的数据(例如 firstResult)传递给另一个FXML视图的控制器。这通常通过 FXMLLoader 来实现。

import javafx.fxml.FXMLLoader;import javafx.scene.Parent;import javafx.scene.Scene;import javafx.stage.Stage;import java.io.IOException;// ... 在TableController中 ...private void loadAnotherFxml(Employee employeeToPass) {    try {        FXMLLoader loader = new FXMLLoader(getClass().getResource("/com/example/detailView.fxml"));        Parent root = loader.load();        // 获取目标控制器的实例        DetailController detailController = loader.getController();        // 调用目标控制器的方法来设置数据        detailController.initData(employeeToPass);        Stage stage = new Stage();        stage.setScene(new Scene(root));        stage.setTitle("员工详情");        stage.show();        // 如果需要关闭当前窗口        // ((Stage) mTableView.getScene().getWindow()).close();    } catch (IOException e) {        e.printStackTrace();        // 错误处理,例如显示一个警告框        // Alert alert = new Alert(Alert.AlertType.ERROR, "无法加载详情视图:" + e.getMessage());        // alert.showAndWait();    }}

对应的 DetailController 示例:

package com.example;import javafx.fxml.FXML;import javafx.scene.control.Label;public class DetailController {    @FXML    private Label idLabel;    @FXML    private Label nameLabel;    @FXML    private Label salaryLabel;    public void initData(Employee employee) {        if (employee != null) {            idLabel.setText("ID: " + employee.getId());            nameLabel.setText("姓名: " + employee.getName());            salaryLabel.setText("薪水: " + employee.getSalary());        }    }}

以及 detailView.fxml 示例:

    

注意事项与最佳实践

处理空结果集: 在 handleSearch 方法中,务必检查 currentDisplayedEmployees 是否为空。如果为空,应向用户提供适当的反馈(例如,弹出一个提示框)。处理多结果集: 如果筛选后有多个结果,您需要决定如何处理。选择第一个: 如示例所示,直接获取 get(0)。全部处理: 遍历整个 currentDisplayedEmployees 列表。用户选择: 如果希望用户从多个结果中手动选择,可以考虑在 TableView 中添加一个选择列,或者弹出一个新的 Dialog 让用户进行选择。性能优化: 对于非常大的数据集(数万甚至数十万条记录),实时筛选可能会有性能问题。可以考虑:延迟搜索: 使用 Platform.runLater 或 Timeline 在用户停止输入一段时间后才执行筛选。后端搜索: 将搜索逻辑移到后端服务,只加载匹配的数据。错误处理: 在加载新的FXML文件时,FXMLLoader.load() 可能会抛出 IOException。务必捕获并处理这些异常,向用户提供友好的错误信息。Predicate逻辑: createSearchPredicate 方法中的逻辑可以根据您的需求进行扩展。例如,可以支持多个字段的组合搜索,或者更复杂的匹配规则(如正则表达式)。

总结

通过本教程,您应该已经掌握了如何在JavaFX中实现 TableView 的动态筛选功能。核心在于利用 FilteredList 和 SortedList 来管理数据视图,并通过 TextField 的文本监听器实时更新筛选条件。在按钮点击事件中,mTableView.getItems() 方法是获取当前筛选后数据集合的关键。结合 FXMLLoader,您可以轻松地将这些数据传递到其他视图,构建更加复杂和交互性强的JavaFX应用程序。

以上就是JavaFX TableView筛选与搜索结果动态获取教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/574401.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
linux能使用固态吗
上一篇 2025年11月10日 07:40:50
如何优雅地在PHP项目中引入事件溯源?EventSauce助你轻松实现
下一篇 2025年11月10日 07:40:59

相关推荐

  • 如何设置Linux软件包更新排除 yum exclude和apt-mark hold

    如何设置Linux软件包更新排除 yum exclude和apt-mark hold如何设置Linux软件包更新排除 yum exclude和apt-mark hold如何设置Linux软件包更新排除 yum exclude和apt-mark hold如何设置Linux软件包更新排除 yum exclude和apt-mark hold

    要阻止linux系统中特定软件包更新,可针对不同发行版使用相应方法。对于rhel/centos系系统,可通过在/etc/yum.conf或.repo文件中添加exclude=包名来排除升级;对于debian/ubuntu系系统,则使用sudo apt-mark hold 包名命令锁定版本。这两种方式…

    2026年9月21日 • 用户投稿
    400
  • MySQL热点数据缓存策略_MySQL减少磁盘访问提升性能

    MySQL热点数据缓存策略_MySQL减少磁盘访问提升性能MySQL热点数据缓存策略_MySQL减少磁盘访问提升性能MySQL热点数据缓存策略_MySQL减少磁盘访问提升性能MySQL热点数据缓存策略_MySQL减少磁盘访问提升性能

    mysql热点数据缓存的核心在于将频繁访问的数据保留在内存中以减少磁盘i/o,提升查询速度并缓解数据库压力。1. innodb缓冲池是关键机制,需合理配置其大小(通常为服务器内存的70-80%)及实例数以优化性能;2. 应用层缓存如redis/memcached通过前置缓存逻辑减少对mysql的直接…

    2026年9月21日 • 用户投稿
    000
  • 如何在Krita导出AI生成的8K艺术图片?保存超高清图像方法

    答案是优先选择PNG格式导出8K AI艺术作品,确保画布为8K分辨率,嵌入sRGB色彩配置文件,并优化系统内存与硬盘性能以提升Krita处理效率。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 在Krita中导出AI生成的8K艺术图片,核心…

    2026年9月21日
    100
  • Laravel 8 登录后重定向到仪表盘的完整教程

    本教程详细介绍了在 Laravel 8 中实现用户登录后重定向到仪表盘的多种方法。我们将探讨如何利用 Laravel 内置的 $redirectTo 属性,以及如何通过重写 LoginController 中的 login 方法来实现自定义重定向逻辑。此外,教程还将重点讲解正确的路由配置和中间件使用…

    2026年9月21日
    000
  • 《如龙 极3》与峰义孝为主角《如龙3外传》等新情报发表

    《如龙 极3》与峰义孝为主角《如龙3外传》等新情报发表《如龙 极3》与峰义孝为主角《如龙3外传》等新情报发表《如龙 极3》与峰义孝为主角《如龙3外传》等新情报发表《如龙 极3》与峰义孝为主角《如龙3外传》等新情报发表

    世嘉公开《如龙极3/如龙3外传  dark ties》官方中文版预告宣传片,将于2026年2月12日发售 ​​​​,登陆ps5/ps4/switch2/xbox/pc平台,全球同步推出。 ​​​ 在2009年于PS3平台发售的《如龙3》焕然重生,为您打造“极致体验”。鲜活真实的冲绳街景、震撼力升级的…

    2026年9月21日 • 用户投稿
    000
  • Android 中使用同一按钮在不同场景下启动不同 Activity

    本文介绍了如何在 Android 应用中使用同一个按钮,根据不同的应用状态启动不同的 Activity。通过在 Activity 间传递额外数据,并根据这些数据动态设置按钮的点击事件,可以实现灵活的页面跳转逻辑。 在 Android 开发中,经常会遇到需要根据用户操作历史或应用状态,使用同一个按钮触…

    2026年9月21日
    000
  • win10剪贴板历史记录打不开怎么办_win10剪贴板历史问题解决方法

    首先检查并开启剪贴板历史记录功能,依次进入设置-系统-剪贴板,启用“剪贴板历史记录”;若无效,通过任务管理器重启Windows资源管理器;接着在服务中确认“Clipboard User Service”已启动且设为自动;然后以管理员身份运行CMD执行echo off | clip清空缓存并重启电脑;…

    2026年9月21日
    100
  • safari浏览器怎么把标签页固定在最左边_safari浏览器标签页固定最左设置

    Safari可通过“固定标签”功能将常用网页保持在标签栏最左并随启动恢复;2. 手动拖动标签至最左可临时调整顺序但不永久保存;3. 结合书签栏添加常用网站并固定标签,可提升访问效率。 如果您希望在使用 Safari 浏览器时将常用网页始终保持在标签栏的最左侧位置,以便快速访问,可以通过以下方法实现标…

    2026年9月21日
    000
  • 如何用Animoto制作AI营销视频?快速生成商业AI视频的教程

    如何用Animoto制作AI营销视频?快速生成商业AI视频的教程如何用Animoto制作AI营销视频?快速生成商业AI视频的教程如何用Animoto制作AI营销视频?快速生成商业AI视频的教程如何用Animoto制作AI营销视频?快速生成商业AI视频的教程

    Animoto通过模板与拖放功能,结合AI生成的文案和配音,帮助用户快速制作品牌统一、节奏合理、带明确CTA的高效营销视频,适用于多平台推广。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ Animoto是一个非常适合快速制作AI营销视频的…

    2026年9月21日 • 用户投稿
    000
  • 使用本地HTML文件运行JavaScript脚本失败的原因及解决方案

    本文旨在帮助开发者理解在没有Web服务器的情况下,直接通过浏览器打开本地HTML文件时,JavaScript脚本可能无法正常运行的原因,并提供相应的解决方案。文章将深入探讨浏览器安全策略、相对路径问题以及如何正确引入和执行JavaScript脚本,确保你的HTML、CSS和JavaScript代码能…

    2026年9月21日
    000
  • 使用正则表达式检测字符串中的除零操作

    本文详细介绍了如何使用正则表达式精确检测字符串中潜在的除零操作。针对表达式中可能存在的变量引用(如<>)、数字、多余空格以及禁止包含引号等复杂情况,文章提供了一个高效的正则表达式模式,并深入解析其构成原理。通过具体的Java代码示例,读者将学习如何将此模式应用于实际编程场景,从而有效识别…

    2026年9月21日
    000
  • AI钉钉1.0联动雅里数科 共探“酒旅+AI”的工作新范式

    在数字化浪潮席卷全球的当下,人工智能正以前所未有的速度重塑各行各业,酒旅产业也正在迎来由ai驱动的深刻变革。10月11日,阿里巴巴钉钉再度走进雅里数科集团,开启一场关于“酒旅行业ai原生工作方式”的深度对话。此次交流标志着双方合作迈入全新阶段,致力于共同探索ai原生工作范式,引领酒旅行业迈向智能化发…

    2026年9月21日
    100
  • win11系统占用C盘空间过大怎么办_Win11清理C盘空间方法

    首先使用磁盘清理工具删除系统文件,包括旧更新和临时安装文件;接着启用存储感知功能自动定期清理临时文件与回收站;然后手动清除用户临时文件夹(%temp%)中的缓存数据;最后更改新应用和个人文件的默认保存位置至非C盘分区,以释放并节省C盘空间。 如果您发现Windows 11系统文件占用了C盘大量空间,…

    2026年9月21日
    100
  • 构建Spring自定义Kafka配置的注解式解决方案

    本文探讨了在Spring Boot应用中通过自定义注解实现Kafka配置自动化时遇到的挑战,特别是由于Bean注册时机不当导致的依赖注入失败。我们将深入分析问题根源,并提供两种核心解决方案:利用META-INF/spring.factories实现标准化的自动配置发现,以及通过ImportBeanD…

    2026年9月21日
    1100
  • 悟空浏览器开发者工具的控制台怎么用_悟空浏览器Console控制台使用入门教程

    首先启用悟空浏览器开发者工具并进入Console标签,可查看错误、警告等日志信息,通过过滤功能定位问题;支持执行JavaScript代码实时调试,监控网络请求失败及全局异常,还可清空或保存日志以便分析。 如果您在使用悟空浏览器进行网页开发或调试时,发现页面元素未按预期工作或脚本报错,则可以借助开发者…

    2026年9月21日
    700
  • 蝴蝶号无人直播中的AI角色控制技巧与注意事项

    蝴蝶号无人直播中的AI角色控制技巧与注意事项蝴蝶号无人直播中的AI角色控制技巧与注意事项蝴蝶号无人直播中的AI角色控制技巧与注意事项蝴蝶号无人直播中的AI角色控制技巧与注意事项

    要让蝴蝶号ai角色在直播中更具真实感和互动性,关键在于注入“人味儿”,打破“机器感”。首先,声音要有温度,选择有情感起伏的音色,并根据不同语境调整语调、语速,适当加入语气词增强亲切感;其次,确保视觉形象与行为模式统一,动作、表情、眼神与语音内容自然同步,强化人设一致性;第三,建立多层次互动逻辑,ai…

    2026年9月21日 • 用户投稿
    400
  • SpringBoot的定时任务

    SpringBoot的定时任务SpringBoot的定时任务SpringBoot的定时任务SpringBoot的定时任务

    大家好,我是你们的老朋友全栈君。我们又见面了。 一、基于注解(@Scheduled)的定时任务 使用SpringBoot的@Scheduled注解来创建定时任务非常简单,只需几行代码就能实现。然而,@Scheduled默认是单线程运行,这意味着当启动多个任务时,一个任务的执行时间可能会影响到下一个任…

    2026年9月21日 • 用户投稿
    400
  • 百度网盘官方网页登录 百度网盘网页版入口快捷

    百度网盘官方网页登录入口是https://pan.baidu.com,用户可直接访问该网址登录账号,主界面布局清晰,支持文件上传下载、智能检索、跨设备同步及在线预览等功能。 百度网盘官方网页登录入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来百度网盘网页版入口快捷方式,感兴趣的网友一起…

    2026年9月21日
    100
  • MAC系统磁盘空间不足怎么办_Mac磁盘空间清理与管理技巧

    Mac存储空间不足时,应先使用系统自带的存储管理工具分析并优化存储,通过“关于本机”进入“管理”界面,启用优化选项;接着手动删除不常用应用及其在Application Support和Caches中的残留文件;再进入资源库清理Caches和Logs中的缓存与日志;随后在“避免杂乱”中查找并删除大型无…

    2026年9月21日
    000
  • DALL-E的AI混合工具如何使用?生成创意图像的详细操作教程

    DALL-E的AI混合工具能将两张图片融合生成新图像,操作简单且支持权重调整与后期编辑,适用于创意激发与艺术探索。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ DALL-E的AI混合工具,简单来说,就是把两张图“缝合”在一起,让AI帮你生…

    2026年9月21日
    000

发表回复

登录后才能评论
关注微信