Dynamiczne filtrowanie tableview

0

Witam.
Mam bardzo duży problem z którym nie potrafię sobie poradzić więc proszę o pomoc.
Mam klasę Wyborca:

package wybory.rs.jpa;

import java.sql.Timestamp;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "Wyborcy")
public class Wyborca {

	@Id
	@GeneratedValue
	private int id;

	private String imie;
	private String nazwisko;
	private String nazwisko2;
	private String pesel;
	private String miejscowosc;
	private String ulica;
	private String nr_domu;
	private String nr_lokalu;
	private Timestamp data_glosowania;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getImie() {
		return imie;
	}

	public String getNazwisko2() {
		return nazwisko2;
	}

	public void setNazwisko2(String nazwisko2) {
		this.nazwisko2 = nazwisko2;
	}

	public String getMiejscowosc() {
		return miejscowosc;
	}

	public void setMiejscowosc(String miejscowosc) {
		this.miejscowosc = miejscowosc;
	}

	public void setImie(String imie) {
		this.imie = imie;
	}

	public String getNazwisko() {
		return nazwisko;
	}

	public void setNazwisko(String nazwisko) {
		this.nazwisko = nazwisko;
	}

	public String getPesel() {
		return pesel;
	}

	public void setPesel(String pesel) {
		this.pesel = pesel;
	}

	public String getUlica() {
		return ulica;
	}

	public void setUlica(String ulica) {
		this.ulica = ulica;
	}

	public String getNr_domu() {
		return nr_domu;
	}

	public void setNr_domu(String nr_domu) {
		this.nr_domu = nr_domu;
	}

	public String getNr_lokalu() {
		return nr_lokalu;
	}

	public void setNr_lokalu(String nr_lokalu) {
		this.nr_lokalu = nr_lokalu;
	}

	public Timestamp getData_glosowania() {
		return data_glosowania;
	}

	public void setData_glosowania(Timestamp data_glosowania) {
		this.data_glosowania = data_glosowania;
	}

}

i teraz w programie mam TextEdit o nazwie szukaj oraz tabele (tbview)
Kiedy wpisuje np: poszczególne numery PESEL tabela mi się odświeża zwracając listę rekordów które pasują do wprowadzonego tekstu.
Niestety problem polega na tym że jak przy pierwszym uruchomieniu wczytuje mi do tej tabeli wszystkie rekordy, tak potem przy podaniu już pierwszej litery wyszukiwania pojawiaja się tylko rekordy których PESEL pasuję oraz maja podaną datę głosowania niestety nie pokazują się te rekordy które mają datę głosowania ustawioną na null;
Nie mam pojęcia dlaczego tak jest. Nigdzie nie sprawdzam czy data jest null;
A oto moje metody które za to wyszukiwanie odpowiadają ( wzorowałem się przykładem który znalazłem w sieci)
Metoda głowna

public GUI() {

		EntityManagerFactory EntityManagerFactory = Persistence
				.createEntityManagerFactory("wyboryDB");
		EntityManager entityManager = EntityManagerFactory
				.createEntityManager();
		TypedQuery<Wyborca> query = entityManager.createQuery(
				"select w from Wyborca w", Wyborca.class);
		data = FXCollections.<Wyborca> observableArrayList(query
				.getResultList());

		filteredData.addAll(data);
		data.addListener(new ListChangeListener<Wyborca>() {

			@Override
			public void onChanged(
					ListChangeListener.Change<? extends Wyborca> change) {
				updateFilteredData();

			}

		});
		entityManager.clear();
		EntityManagerFactory.close();
		
	}

Metoda updateFilteredData();

private void updateFilteredData() {
		// TODO Auto-generated method stub
		filteredData.clear();
		for (Wyborca w : data) {
			System.out.println(data.size());
			if (matchesFilter(w)) {
				filteredData.add(w);
				
			}
		}
		reapplyTableSortOrder();

	}

Metoda porównania znaków matchesFilter

private boolean matchesFilter(Wyborca w) {
		// TODO Auto-generated method stub
		String filterString = Szukaj.getText();
		if (filterString == null || filterString.isEmpty()) {
			return true;
		}
		String lowerCaseFilterString = filterString.toLowerCase();
		
			if (w.getPesel().toLowerCase().indexOf(lowerCaseFilterString) != -1) {
			return true;
		
		}

		return false;
	}

I ostatnia metoda ale chyba mało ważna

	// TODO Auto-generated method stub
		ArrayList<TableColumn<Wyborca, ?>> sortOrder = new ArrayList<>(
				tbView.getSortOrder());
		tbView.getSortOrder().clear();
		tbView.getSortOrder().addAll(sortOrder);

	}

Wydaję mi się że problem jest w metodzie updateFilteredData() nie wiem czemu pętla

for (Wyborca w : data)

bierze pod uwagę tylko te rekordy w które mają ustawioną datę
Oczywiście zmienne data i filteredData to ObservableList<Wyborca>
Bardzo proszę o pomoc bo męczę się z tym już bardzo długo i nie mam pojęcia co robię źle.
Pozdrawiam

0

Dziwi mnie trochę dlaczego masz listenera ustawionego na kolekcje data a pewnie powinno być na obiekt TextEdit.
Co zasila tabelke, data czy filteredData? Debugowałeś się na tej linijce

for (Wyborca w : data) 

? Myślę że sporo by się wyjaśniło, przede wszystkim co się mieści w data, czy wszystkie rekordy które pobrałeś z bazy. I jak wyglada koleckja filteredData po filtrowaniu.

0
sudiero napisał(a):

Dziwi mnie trochę dlaczego masz listenera ustawionego na kolekcje data a pewnie powinno być na obiekt TextEdit.
.

Taki przykład znalazłem na sieci i na nim się opierałem , dane z bazy ładowane są do data a potem do filteredData i to jest podstawione do tabeli.
W data na starcie są wszystkie rekordy następnie potem przy wprowadzeniu pierwszej litery w TexEdit w dacie znajdują się tylko rekordy z datą i nie wiem dlaczego. Zaraz siądę i wszystko na spokojnie jeszcze raz przejże bo pewnie gdzieś mi się jakś babol wkradł.

0

Przeanalizowałem kod na spokojnie i dzisiaj wpadłem że zmienna data które przekazuje jest zmieniona przez inna metodę. Błąd tak głupi że aż się wkurzam że tyle czasu nad tym spędziłem ( niestety początki są zawsze bolesne:)
Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1