私は奇妙な問題を抱えていますが、それは私のコードの問題ですが、見つけ出すことはできません。javafx述語が初めて初めて起動する
問題: 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;
};
は、今私はテキストフィールドに新しいテキストを入力するたびに、私のリスナーが実行取得されますが、述語論理は初回のみと呼ばれます。 2回目から、述語(somePredicate)が呼び出されません。
私を助けてください。また、私のコードが良いかそれとももっと良い方法でこれをより良いパフォーマンスで実現するかを提案する。 bcoz私はフィルタリングされたリストのfilteredPropertyがテキストフィールドのtextPropertyに直接接続されているというバインディングを使用するコードをいくつか見ています。
1つ以上のこと。述部内のロジックは、行を返す場合は、列のいずれかに含まれるテキストをチェックすることです。私は20列あります。だから私はすべての20列または他の方法のすべてのif条件を記述する必要があります。 forループは唯一の方法ですか?または私は.foreachを使用して何かすることができます。
ありがとうございました。
素晴らしいですが、私はチェックウルの解決策を適用しませんでしたが、意味があります。私はそれを試してみましょう。また、複数の質問を残して申し訳ありません。私は今から自分自身を修正します。 –
ねえ、私はうまく解決しようとしています。最初に解決した問題。第2の問題。すべての列をループして、私はtradeProperties()と言うことができません。 p.containsは動作しません。私は述語であるpのcontainsメソッドを呼び出すことができません。 –
Jamesに感謝します。出来た。どうもありがとう。 http://stackoverflow.com/questions/38801302/design-to-keep-helper-methods-in-javafx-projectを見てください。 –