2016-09-12 6 views
1

を持つ小さなアプリケーションを作成しました。テーブルビュー複数のフィルタオプションがあります。複数のフィルタオプションを持つJavafx TableView

enter image description here

は、フィルタオプションは、アプリケーションで提供されている次のとおりです:下記のように見えます - (検索表)

  • リリース5/6オブジェクトのTextField

    • オブジェクト名/所在地 - - チェックボックス(リリース5オブジェクトとリリース6オブジェクト)
    • ライブオブジェクト - チェックボックス(ライブオブジェクト)

    現在のところ、私が直面している問題は、私は1つのフィルタ基準を時間通りにしか使用できないということです。異なるフィルタ条件の組み合わせを使用しようとすると、前のフィルタ条件が無視され、最後のフィルタ条件が使用されてTableViewが作成されます。

    - 検索テーブルTextFieldに "OBJ"という単語を入力すると、オブジェクト名または場所に "OBJ"という単語が含まれている行のみがテーブルに含まれます。ここでRelease 6 Objectsチェックボックスを選択すると、テーブルはSearch Table TextFieldに記載された "OBJ"フィルタを無視し、バージョンが6のすべてのオブジェクトを表示します。

    私が何をしようとしているのは、リリース6のオブジェクトCheckBoxの場合、オブジェクト名/ロケーションにOBJが含まれ、バージョンが6の行のみがテーブルに含まれている必要があります。

    同様に、すべてのフィルタ条件または異なるフィルタの組み合わせ基準。誰もこれで私を助けることができますか?

  • +0

    ためのコードです:リリース6つのオブジェクトを選択し、フィルタされた場合、最初のあなたがチェックすべてのフィルタがチェックされるまで、リリース5のオブジェクトが選択されていることを確認し、データをフィルタリングします。 – aleb2000

    +0

    また、関連するコードを質問に追加できますか? – aleb2000

    答えて

    1

    最後に、複数の試行の後、私はこれを達成する方法を見つけました。

    以前私がテーブルデータとしてObservableListローカルSortedListのFilteredList変数を使用します。今私はグローバルSortedListFilteredList変数を使用しています。

    ファイルからデータを読み込み、FilteredListにデータをロードしFilteredListを使用して、新しいグローバルSortedListのを作成します。 SortedList comparatorPropertyをテーブルcomparatorPropertyにバインドし、グローバルソートリストをテーブルに割り当てます。以下

    各フィルタフィールド、次いで上記

    filteredObjects = new FilteredList<>(objects, p -> true); 
    sortedObjects = new SortedList<>(filteredObjects); 
    sortedObjects.comparatorProperty().bind(tblPrimeCodeList.comparatorProperty()); 
    tblPrimeCodeList.setItems(sortedObjects); 
    

    を行うためのコードは、各フィルタフィールドフィルタの値に基づいてデータを再度濾過される新しいChangeListenerを、追加されています。以下は、TextFieldフィルタの検索テーブルのコードです。以下は

    txtFilter.textProperty().addListener((observable, oldValue, newValue) -> { 
    filteredObjects.setPredicate(obj -> { 
        if (!chkRel5.isSelected() && !chkRel6.isSelected()) { 
         return false; 
        } 
    
        if (newValue == null || newValue.isEmpty()) { 
        } else { 
         String lowerCaseFilter = newValue.toLowerCase(); 
         if (obj.getName().toLowerCase().contains(lowerCaseFilter) || 
          obj.getLocation().toLowerCase().contains(lowerCaseFilter)) { 
         } else { 
          return false; 
         } 
        } 
    
        if (chkLiveObj.isSelected() && !obj.getLive()) { 
         return false; 
        } 
    
        if (!chkRel5.isSelected() && obj.getVersion() == 5) { 
         return false; 
        } 
    
        if (!chkRel6.isSelected() && obj.getVersion() == 6) { 
         return false; 
        } 
    
        return true; 
        }); 
    }); 
    

    私はあなたがたとえば、一度に一つのフィルタをチェックすることをお勧めのCheckBox リリース5オブジェクト

    chkRel5.selectedProperty().addListener(new ChangeListener<Boolean>() { 
    
    @Override 
    public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) { 
    filteredObjects.setPredicate(obj -> { 
        if (!chkRel5.isSelected() && obj.getVersion() == 5) { 
         return false; 
        } 
    
        if (!chkRel6.isSelected() && obj.getVersion() == 6) { 
         return false; 
        } 
    
        if (chkLiveObj.isSelected() && !obj.getLive()) { 
         return false; 
        } 
    
        if (txtFilter.getText().trim().length() > 0) { 
         String lowerCaseFilter = txtFilter.getText().trim().toLowerCase(); 
         if (obj.getName().toLowerCase().contains(lowerCaseFilter) || 
          obj.getLocation().toLowerCase().contains(lowerCaseFilter)) { 
         } else { 
          return false; 
         } 
        } 
        return true; 
        }); 
        sortedObjects = new SortedList<>(filteredObjects); 
        } 
    }); 
    
    関連する問題