【问题标题】:JavaFX DatePicker listener to filter data in TableViewJavaFX DatePicker 监听器过滤 TableView 中的数据
【发布时间】:2018-09-28 05:26:24
【问题描述】:

用最简单的方式来说,我想根据两个 DatePicker 中所选日期的日期范围过滤 TableView 中的数据。

有没有办法添加一个监听器或类似于在 TextFields 上使用 addListener 的方法,或者有没有更好的方法来解决这个问题?我找不到任何解释这个的教程。

我是否应该只针对在按下按钮时调用 Postgres 视图来更新表格?

在图像中,如果它正在工作,它将仅显示 TID 为 16 和 17 的行,其中“已打开”列中的日期介于日期范围之间。

【问题讨论】:

  • 您想为第二个DatePicker 添加一个监听器。检查以确保第二个日期晚于第一个日期。接下来,根据日期范围过滤表格。我会亲自在TableView 上使用FilteredListcode.makery.ch/blog/javafx-8-tableview-sorting-filtering
  • @Sedrick 谢谢,我已经有了日期约束,并且我尝试使用过滤列表将侦听器部分应用于日期,但发现所有格式都比我使用函数想出的要复杂得多调用结果在这些日期之间的视图。
  • @EstebanRodriguez 通常基于 2 个LocalDates 创建一个Predicate 应该不难。您是否在您的项目类别中使用java.sql.Date,或者您为什么认为这很复杂?
  • @fabian 也许还不错,但是我的时间有限,而且基本上日期之间的格式让我受益匪浅,但现在回想起来,我似乎确实理解了日期格式,但日期之间的比较。我应该改为比较字符串吗?我希望我还有代码,但它基本上是 Sedrick 在第一条评论中链接的内容,除了我无法获得日期的比较部分。

标签: javafx datepicker tableview


【解决方案1】:

以下答案我假设您在您的项目类中使用LocalDate。如果您使用java.sql.Date,以下问题说明了如何进行转换:

Convert between LocalDate and sql.Date

使用FilteredList过滤完整的数据集(假设db表足够小,可以存储在客户端内存中)。

ObservableList<TableItem> allItems = ...
FilteredList<TableItem> filteredItems = new FilteredList<>(allItems);

// bind predicate based on datepicker choices
filteredItems.predicateProperty().bind(Bindings.createObjectBinding(() -> {
        LocalDate minDate = startPicker.getValue();
        LocalDate maxDate = endPicker.getValue();

        // get final values != null
        final LocalDate finalMin = minDate == null ? LocalDate.MIN : minDate;
        final LocalDate finalMax = maxDate == null ? LocalDate.MAX : maxDate;

        // values for openDate need to be in the interval [finalMin, finalMax]
        return ti -> !finalMin.isAfter(ti.getOpenDate()) && !finalMax.isBefore(ti.getOpenDate());
    },
    startPicker.valueProperty(),
    endPicker.valueProperty()));

tableView.setItems(filteredItems);

【讨论】:

  • 太棒了,谢谢。这很容易遵循。我之前所拥有的不是关闭这个。我在课堂上使用 LocalDate。这就是我在网上找到的等效数据。使用此过滤列表时,格式化类中的日期会影响比较吗?
  • 如果有人也想要过滤查询,只需在此 FilteredList1 下创建另一个 FilteredList2 并将输入设置为 FilteredList1。将新的 predicateProperty 设置为 FilteredList2 并根据需要设置条件。这将过滤掉指定日期的查询。优势?即使 date 为 null,您仍然可以根据查询获取过滤数据。
猜你喜欢
  • 1970-01-01
  • 2021-08-23
  • 2017-08-13
  • 2019-02-10
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
相关资源
最近更新 更多