Filtern von TableView Liste

MiMa

Top Contributor
In meinem Fenster habe ich eine TableView mit zwei Spalten.
Darüber eine Entfernen Schaltfläche und ein Textfeld zum Filtern der Liste.
Die Filterung funktioniert soweit ganz gut.
Filter01.jpgFilter02.jpg Filter03.jpg
Wenn ich jedoch auf die Entfernen Schaltfläche klicke funktioniert die dahinterliegende Operation und löscht den selektierten eintrag.
Nach dem löschen des eintrages wird auch das Filterfeld geleert und die Vollständige Liste wird aktualisiert.
Soweit alles gut.
Wenn ich aber jetzt versuche wieder zu filtern dann funktioniert die Filterung nicht mehr?
Wie kann das sein das es am anfang einmal funktioniert und dann nicht mehr nachdem die entfernen Schaltfläche ausgeführt wurde.

Das ist die Filter-Methode die ich geschrieben habe
Java:
 private void filterMimeListe(String filterText) {
        if (mimeListe == null) {
            return;
        }

        // Erstellen Sie eine finale Referenz auf mimeListe
        final ObservableList<String[]> finalMimeListe = mimeListe;

        // Erstellen Sie eine Instanz von FilteredList
        FilteredList<String[]> filteredList = new FilteredList<>(finalMimeListe);

        // Fügen Sie einen Predicate hinzu, um zu definieren, welche Elemente in der gefilterten Liste angezeigt werden sollen
        filteredList.setPredicate(mimeEintrag -> {
            if (filterText == null || filterText.isEmpty()) {
                // Wenn das Textfeld leer ist, zeigen Sie alle Elemente an
                return true;
            }
            // Überprüfen, ob der MIME-Typ oder die Endung den Suchbegriff enthält
            String mimeType = mimeEintrag[0].toLowerCase();
            String fileExtension = mimeEintrag[1].toLowerCase();
            return mimeType.contains(filterText.toLowerCase()) || fileExtension.contains(filterText.toLowerCase());
        });

        // Setzen Sie die gefilterte Liste als Datenquelle für den TableView
        einstellungenMimeListeTableView.setItems(filteredList);
    } // filterMimeListe

Und das ist die Methode zum löschen des selektierten eintrages
Java:
 @FXML
    void entferneEintragMimeListe(ActionEvent event) {
        System.out.println("Die Liste hat " + mimeListe.size() + " Einträge");

        // Ausgabe der aktuellen Liste auf der Konsole
        System.out.println("Aktuelle MIME-Liste:");
        for (String[] eintrag : mimeListe) {
            System.out.println(Arrays.toString(eintrag));
        }

        // Überprüfen, ob ein Eintrag ausgewählt wurde
        if (einstellungenMimeListeTableView.getSelectionModel().isEmpty()) {
            System.out.println("Kein Eintrag ausgewählt.");
            return;
        }

        // Abrufen des ausgewählten Eintrags
        String[] ausgewaehlterEintrag = einstellungenMimeListeTableView.getSelectionModel().getSelectedItem();
        if (ausgewaehlterEintrag == null) {
            System.out.println("Ausgewählter Eintrag ist null.");
            return;
        }

        // Überprüfen, ob der ausgewählte Eintrag in der Liste vorhanden ist
        boolean gefunden = false;
        for (String[] eintrag : mimeListe) {
            if (Arrays.equals(eintrag, ausgewaehlterEintrag)) {
                gefunden = true;
                break;
            }
        }

        if (!gefunden) {
            System.out.println("Ausgewählter Eintrag ist nicht in der Liste vorhanden.");
            System.out.println("Der ausgewählte Eintrag ist: " + Arrays.toString(ausgewaehlterEintrag));
            return;
        }

        // Entfernen des ausgewählten Eintrags aus der Liste
        mimeListe.remove(ausgewaehlterEintrag);

        // Ausgabe der aktualisierten Liste auf der Konsole
        System.out.println("Aktualisierte MIME-Liste nach Entfernen:");
        for (String[] eintrag : mimeListe) {
            System.out.println(Arrays.toString(eintrag));
        }

        // Aktualisieren der Konfigurationsdatei auf der Festplatte
        Path configFile = Paths.get(System.getProperty("user.home"), "DMS", "mime-zu-endung.properties");
        try {
            List<String> lines = new ArrayList<>();
            for (String[] eintrag : mimeListe) {
                lines.add(String.join("=", eintrag));
            }
            Files.write(configFile, lines);
            System.out.println("Aktualisierte Konfigurationsdatei wurde erfolgreich geschrieben.");
        } catch (IOException e) {
            System.err.println("Fehler beim Schreiben der Konfigurationsdatei: " + e.getMessage());
            e.printStackTrace();
        }

        // Zurücksetzen des Filterfelds auf leeren String und Auslösen eines neuen Filter-Events
        einstellungenDateiMimeFilterTextField.setText("");
//        einstellungenDateiMimeFilterTextField.fireEvent(new ActionEvent());

        // Aktualisieren der Anzeige auf dem JavaFX Application Thread
        Platform.runLater(() -> {
            einstellungenMimeListeTableView.setItems(FXCollections.observableArrayList(mimeListe));
            lblAnzahlMimeEintraege.setText(String.valueOf(mimeListe.size()));
        });
    }

Ich habe in der Löschen Methode das Filter Textfeld schon mit .clear und "" zurückgesetzt aber ein weitere Filtern war nicht
mehr möglich.

Ich würd emich freuen wenn jemand einen Trip hat waran es liegen könnte.

Vielen Dank
 
Ich bin jetzt kein JavaFX Profi, aber für mich sieht es so aus als ob du in Zeile 68 die Liste neu setzt..das ist dann keine FilteredList mehr...
 
Vielen Dank für den Hinweis.
Ich habe die Zeile 68 korrigiert und jetzt funktioniert alles wie es soll. ☺️
 

Zurück
Oben