我有一个奇怪的问题,我敢肯定这是我的代码问题,但无法找到答案。javafx谓词只有第一次触发
问题: 我有一个javafx TableView,它由一个过滤器列表支持,并由一个可观察列表支持。我的要求是根据用户在文本字段中输入的输入过滤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我看到一些使用绑定的代码,说过滤列表的filteredProperty直接附加到文本字段的textProperty。
还有一件事。谓词中的逻辑是检查文本是否包含在任何列中,如果是的话返回该行。我有20列。所以我需要为所有20列或其他任何方式编写if条件。是循环是唯一的方法?或者我可以使用.foreach并做一些事情。
在此先感谢。
太棒了,我没有申请n检查你的解决方案,但它是有道理的。让我尝试一下。也抱歉提出多个问题。我从现在开始纠正自己。 –
嘿,我正在尝试你的解决方案。解决第一个问题。第二个问题。循环所有列,我无法说tradeProperties()。stream()。anyMatch(p - > p.contains(filterText)); p.contains不起作用。我无法调用p谓词上的contains方法。 –
谢谢詹姆斯。有效。非常感谢。你不介意看看http://stackoverflow.com/questions/38801302/design-to-keep-helper-methods-in-javafx-project –