【发布时间】:2016-08-05 07:54:49
【问题描述】:
我有一个奇怪的问题,我确定这是我的代码问题,但无法找出。
问题: 我有一个 javafx TableView,它由一个过滤列表支持,而过滤列表又由一个可观察列表支持。我的要求是根据用户在文本字段中输入的输入过滤表格视图数据。所以我在文本字段的 textProperty 上附加了一个失效侦听器,并且我正在尝试根据我的业务条件设置过滤列表的谓词,这很好。
见以下代码:
externalTradeTableViewDataFilterTextField.textProperty().addListener((obs) -> {
//externalTradesFilteredList.setPredicate(somePredicate);
String filterText = externalTradeTableViewDataFilterTextField.getText().trim().toLowerCase();
externalTradesFilteredList.setPredicate((ExternalTrade anExternalTrade) -> {
if(filterText == null || filterText.isEmpty() || filterText.equals(""))
return true;
if(anExternalTrade.getOid().toString().contains(filterText))
return true;
else
if(anExternalTrade.getExternalTradeSourceOid().getExternalTradeSrcName().toLowerCase().contains(filterText))
return true;
else
if(anExternalTrade.getExternalTradeStatusOid().getExternalTradeStatusName().toLowerCase().contains(filterText))
return true;
else
if(anExternalTrade.getExternalTradeStateOid().getExternalTradeStateName().toLowerCase().contains(filterText))
return true;
return false;
});
});
自从我实现了我的要求后,我开始专注于代码重构。因此计划将谓词逻辑移动到单独的谓词并将谓词移动到另一个类,以便我可以重用它。 问题从这里开始。
见以下代码:
externalTradeTableViewDataFilterTextField.textProperty().addListener((obs) -> {
externalTradesFilteredList.setPredicate(somePredicate);
});
private Predicate<ExternalTrade> somePredicate = (ExternalTrade anExternalTrade) -> {
String filterText = externalTradeTableViewDataFilterTextField.getText().trim().toLowerCase();
if(filterText.isEmpty() || filterText == null || filterText.equals(""))
return true;
if(anExternalTrade.getOid().toString().contains(filterText))
return true;
else if(anExternalTrade.getExternalTradeSourceOid().getExternalTradeSrcName().toLowerCase().contains(filterText))
return true;
else if(anExternalTrade.getExternalTradeStatusOid().getExternalTradeStatusName().toLowerCase().contains(filterText))
return true;
else if(anExternalTrade.getExternalTradeStateOid().getExternalTradeStateName().toLowerCase().contains(filterText))
return true;
return false;
};
现在,每次我在文本字段中输入新文本时,我的侦听器都会被执行,但谓词逻辑只是第一次被调用。从第二次开始,谓词 (somePredicate) 没有被调用。
请帮助我。还建议我的代码是否良好或任何其他更好的方式来实现这一点并具有更好的性能。 bcoz 我确实看到一些使用绑定的代码,说过滤列表的过滤属性直接附加到文本字段的文本属性。
还有一件事。谓词中的逻辑是检查文本是否包含在任何列中,如果是则返回该行。我有 20 列。所以我需要为所有 20 列或任何其他方式编写 if 条件。是for循环是唯一的方法吗?或者我可以使用 .foreach 做点什么。
提前致谢。
【问题讨论】: