- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想禁止显示 Vaadin Flow 14 中 Grid
小部件中的某些项目。
例如,如果用户在 IntegerField
小部件中输入年份,我希望网格仅显示关联日期早于该年的项目。日期在该日期或之后的项目应该消失。如果用户更改年份数字,则应重新应用过滤,并在网格中适当显示更少或更多的项目。
我已经在 Grid
上讨论过过滤器,但无法理解各种移动部件。也许有人可以举一个简单的例子?
最佳答案
我将提交使用 ListDataProvider
过滤网格的方法。我的方法的目标是能够为您想要的任何列添加过滤器字段,并且过滤器可以相互组合,而且每个过滤器值都可以随时更改为其他值。通过我的解决方案,您还可以使用 TextField 之外的其他输入字段。因此也可以使用 ComboBoxes 进行枚举等。
关键在于,当您使用 ListDataProvider 的 setFilter
方法时,任何其他过滤器都会被忽略,因此多个过滤器不会同时工作。但是,当您专门使用 addFilter
时,您永远无法更改您定义的过滤器,只能在其之上添加另一个过滤器。您可以让用户使用专用于此目的的按钮清除所有过滤器,但我想避免这种情况。
这就是我避免这个难题的方法:每次任何过滤器值发生变化时,我都会使用setFilter
重置当前过滤器。但在该新过滤器中,我将检查所有过滤器字段的值,而不仅仅是值刚刚更改的字段的值。换句话说,我始终只有一个过滤器处于事件状态,但该过滤器考虑了所有定义的过滤器值。
这里是带有网格的 View 的完整工作代码(见下图),使用与OP原始答案相同的示例。您可以同时按字符串表示形式、年、月或星期几过滤此网格。
@Route(value = "Test", layout = MainView.class)
public class TestView extends VerticalLayout {
private Grid<LocalDate> grid;
private TextField toStringFilter, yearFilter;
private ComboBox<Month> monthFilter;
private ComboBox<DayOfWeek> dayOfWeekFilter;
public TestView() {
grid = new Grid<>(LocalDate.class, false);
List< LocalDate > dates = List.of(
LocalDate.of( 2020 , Month.JANUARY , 23 ) ,
LocalDate.of( 2019 , Month.FEBRUARY , 24 ) ,
LocalDate.of( 2022 , Month.MARCH , 25 ) ,
LocalDate.of( 2011 , Month.APRIL , 26 ) ,
LocalDate.of( 2022 , Month.APRIL , 23 )
);
grid.setItems( new ArrayList< LocalDate >( dates ) );
grid.addColumn( LocalDate :: toString ).setHeader("String Representation").setKey("tostring");
grid.addColumn( LocalDate :: getYear ).setHeader("Year").setKey("year");
grid.addColumn( LocalDate :: getMonth ).setHeader("Month").setKey("month");
grid.addColumn( LocalDate :: getDayOfWeek ).setHeader("Day Of Week").setKey("dayofweek");
prepareFilterFields();
add(grid);
}
private void prepareFilterFields() {
HeaderRow headerRow = grid.appendHeaderRow();
toStringFilter = gridTextFieldFilter("tostring", headerRow);
yearFilter = gridTextFieldFilter("year", headerRow);
monthFilter = gridComboBoxFilter("month", headerRow, Month::toString, Month.values());
dayOfWeekFilter = gridComboBoxFilter("dayofweek", headerRow, DayOfWeek::toString, DayOfWeek.values());
}
private <T> ComboBox<T> gridComboBoxFilter(String columnKey, HeaderRow headerRow, ItemLabelGenerator<T> itemLabelGenerator, T... items) {
ComboBox<T> filter = new ComboBox<>();
filter.addValueChangeListener(event -> this.onFilterChange());
filter.setItemLabelGenerator(itemLabelGenerator);
filter.setItems(items);
filter.setWidthFull();
filter.setClearButtonVisible(true);
headerRow.getCell(grid.getColumnByKey(columnKey)).setComponent(filter);
return filter;
}
private TextField gridTextFieldFilter(String columnKey, HeaderRow headerRow) {
TextField filter = new TextField();
filter.setValueChangeMode(ValueChangeMode.TIMEOUT);
filter.addValueChangeListener(event -> this.onFilterChange());
filter.setWidthFull();
headerRow.getCell(grid.getColumnByKey(columnKey)).setComponent(filter);
return filter;
}
private void onFilterChange(){
ListDataProvider<LocalDate> listDataProvider = (ListDataProvider<LocalDate>) grid.getDataProvider();
// Since this will be the only active filter, it needs to account for all values of my filter fields
listDataProvider.setFilter(item -> {
boolean toStringFilterMatch = true;
boolean yearFilterMatch = true;
boolean monthFilterMatch = true;
boolean dayOfWeekFilterMatch = true;
if(!toStringFilter.isEmpty()){
toStringFilterMatch = item.toString().contains(toStringFilter.getValue());
}
if(!yearFilter.isEmpty()){
yearFilterMatch = String.valueOf(item.getYear()).contains(yearFilter.getValue());
}
if(!monthFilter.isEmpty()){
monthFilterMatch = item.getMonth().equals(monthFilter.getValue());
}
if(!dayOfWeekFilter.isEmpty()){
dayOfWeekFilterMatch = item.getDayOfWeek().equals(dayOfWeekFilter.getValue());
}
return toStringFilterMatch && yearFilterMatch && monthFilterMatch && dayOfWeekFilterMatch;
});
}
}
<小时/>
未过滤的网格:
<小时/>按年份过滤:
<小时/>按年份和月份过滤:
关于vaadin - 在 Vaadin Flow 14 中过滤网格中的项目的简单示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60256269/
我正在使用 NetBeans 开发 Java 中的 WebService,并使用 gradle 作为依赖管理。 我找到了this article关于使用 gradle 开发 Web 项目。它使用 Gr
我正在将旧项目从 ant 迁移到 gradle(以使用其依赖项管理和构建功能),并且在生成 时遇到问题>eclipse 项目。今天的大问题是因为该项目有一些子项目被拆分成 war 和 jar 包部署到
我已经为这个错误苦苦挣扎了很长时间。如果有帮助的话,我会提供一些问题的快照。请指导我该怎么办????在我看来,它看起来一团糟。 *** glibc detected *** /home/shivam/
我在 Ubuntu 12.10 上运行 NetBeans 7.3。我正在学习 Java Web 开发类(class),因此我有一个名为 jsage8 的项目,其中包含我为该类(class)所做的工作。
我想知道 Codeplex、GitHub 等中是否有任何突出的项目是 C# 和 ASP.NET,甚至只是 C# API 与功能测试 (NUnit) 和模拟(RhinoMocks、NMock 等)。 重
我创建了一个 Maven 项目,包装类型为“jar”,名为“Y”我已经完成了“Maven 安装”,并且可以在我的本地存储库中找到它.. 然后,我创建了另一个项目,包装类型为“war”,称为“X”。在这
我一直在关注the instructions用于将 facebook SDK 集成到我的应用程序中。除了“helloFacebookSample”之外,我已经成功地编译并运行了所有给定的示例应用程序。
我想知道,为什么我们(Java 社区)需要 Apache Harmony 项目,而已经有了 OpenJDK 项目。两者不是都是在开源许可下发布的吗? 最佳答案 事实恰恰相反。 Harmony 的成立是
我正在尝试使用 Jsoup HTML Parser 从网站获取缩略图 URL我需要提取所有以 60x60.jpg(或 png)结尾的 URL(所有缩略图 URL 都以此 URL 结尾) 问题是我让它在
我无法构建 gradle 项目,即使我编辑 gradle 属性,我也会收到以下错误: Error:(22, 1) A problem occurred evaluating root project
我有这个代码: var NToDel:NSArray = [] var addInNToDelArray = "Test1 \ Test2" 如何在 NToDel:NSArray 中添加 addInN
如何在单击显示更多(按钮)后将主题列表限制为 5 个(项目)。 还有 3(项目),依此类推到列表末尾,然后它会显示显示更少(按钮)。 例如:在 Udemy 过滤器选项中,当您点击查看更多按钮时,它仅显
如何将现有的 Flutter 项目导入为 gradle 项目? “导入项目”向导要求 Gradle 主路径。 我有 gradle,安装在我的系统中。但是这里需要设置什么(哪条路径)。 这是我正在尝试的
我有一个关于 Bitbucket 的项目。只有源被提交。为了将项目检索到新机器上,我在 IntelliJ 中使用了 Version Control > Checkout from Ve
所以,我想更改我公司的一个项目,以使用一些与 IDE 无关的设置。我在使用 Tomcat 设置 Java 应用程序方面有非常少的经验(我几乎不记得它是如何工作的)。 因此,为了帮助制作独立于 IDE
我有 2 个独立的项目,一个在 Cocos2dx v3.6 中,一个在 Swift 中。我想从 Swift 项目开始游戏。我该怎么做? 我已经将整个 cocos2dx 项目复制到我的 Swift 项目
Cordova 绝对是新手。这些是我完成的步骤: checkout 现有项目 运行cordova build ios 以上生成此构建错误: (node:10242) UnhandledPromiseR
我正在使用 JQuery 隐藏/显示 li。我的要求是,当我点击任何 li 时,它应该显示但隐藏所有其他 li 项目。当我将鼠标悬停在文本上时 'show all list item but don
我想将我所有的java 项目(223 个项目)迁移到gradle 项目。我正在使用由 SpringSource STS 团队开发的 Gradle Eclipse 插件。 目前,我所有的 java 项目
我下载this Eclipse Luna ,对于 Java EE 开发人员,如描述中所见,它支持 Web 应用程序。我找不到 file -> new -> other -> web projects
我是一名优秀的程序员,十分优秀!