Abhängige CheckBoxListen

jCoder1984

Aktives Mitglied
Hallo zusammen
ich habe in meiner Gui 3 CheckBoxListen. Zu jeder Liste habe ich einen ListChangeEvent definiert.

Mein Problem : Die Listen beinhalten, die voneinander abhängig sind. So hat die Liste1 die Sportverein, Liste2 die Mannschaften und Liste3 die MItglieder. Man soll in jeder Liste Elemente auswählen können, so soll z.B bei der Auswahl einer Mannschaft auch der dazugehörige Verein und alle Mitglieder ausgewählt werden. Wenn ich eine Sportverein auswählen sollen alle Mannschaften dieses Vereins und auch alle Mitglieder jeder Mannschaft ausgewählt werden. Wenn ich ein Mitglied auswähle, sollen alle Mannschaften ausgewählt werden in denen das Mitglied aktiv ist sowie die dazugehörigen Sportvereine.

Diese Listen dienen als Filter zu Anzeige einer Tabelle.

Wie müsst so eine ListChangeEvent aussehen, damit sich die LIsten bei einer Änderung nicht gegenseitig beeinflussen
 

jCoder1984

Aktives Mitglied
Hallo hier mal ein paar Code Schnipsel
Hier werden die CheckBoxListen definiert :
Java:
    @FXML
    private CheckListView<ICompetition> competitionFilterList;
    @FXML
    private CheckListView<ITeam> teamFilterList;
    @FXML
    private CheckListView<IMember> memberFilterList;

Hier werden die Listener zugewiesen :
Java:
    @Override
    public void initialize(URL arg0, ResourceBundle arg1) {

        // add competition filter list change listener
        competitionFilterList.getCheckModel().getCheckedItems().addListener(new ListChangeListener<ICompetition>() {
            @Override
            public void onChanged(Change<? extends ICompetition> c) {
                updateCompetitionFilterTitle();
//                modifyCompetition();
            }
        });

      
        // add team filter list change listener
        teamFilterList.getCheckModel().getCheckedItems().addListener(new ListChangeListener<ITeam>() {
            @Override
            public void onChanged(Change<? extends ITeam> c) {
                updateTeamFilterTitle();
                modifyTeam();
            }
        });

        // add member filter list change listener
        memberFilterList.getCheckModel().getCheckedItems().addListener(new ListChangeListener<IMember>() {
            @Override
            public void onChanged(Change<? extends IMember> c) {
                updateMemberFilterTitle();
            }
        });

So und hier soll nun auf die Änderung (en) reagiert werden :

Java:
    private void updateCompetitionFilterTitle() {
        int items = competitionFilterList.getCheckModel().getItemCount();
        int checkedItems = competitionFilterList.getCheckModel().getCheckedItems().size();

        competitionPane.setText("Wettbewerbe (" + checkedItems + " / " + items + ")");

        ObservableList<ICompetition> checkedCompetitionsItems = competitionFilterList.getCheckModel().getCheckedItems();
        ObservableList<ITeam> selectedTeamItems = FXCollections.observableArrayList();
      
        for (ICompetition competition : competitionFilterList.getCheckModel().getCheckedItems()) {
            for (IMatchDay matchDay : competition.getMatchDayList()) {
                for (IMatch match : matchDay.getMatchList()) {
                    if (!selectedTeamItems.contains(match.getTeam1())) {
                        selectedTeamItems.add(match.getTeam1());
                    }
                    if (!selectedTeamItems.contains(match.getTeam2())) {
                        selectedTeamItems.add(match.getTeam2());
                    }
                }
            }
        }
      
        teamFilterList.getCheckModel().clearChecks();
        selectedTeamItems.forEach(t -> teamFilterList.getCheckModel().check(t));
    }

    private void updateTeamFilterTitle() {
        int items = teamFilterList.getCheckModel().getItemCount();
        int checkedItems = teamFilterList.getCheckModel().getCheckedItems().size();

        teamPane.setText("Mannschaften (" + checkedItems + " / " + items + ")");
    }

    private void updateMemberFilterTitle() {
        int items = memberFilterList.getCheckModel().getItemCount();
        int checkedItems = memberFilterList.getCheckModel().getCheckedItems().size();

        teamPane.setText("Mitglieder (" + checkedItems + " / " + items + ")");
    }

So das Problem : Wenn ich die Liste der Competition ändere soll sich ja auch die Liste der Mannschaften geändert werden. In einem anderen Use Case soll auf Änderungen in der Mannschaftsliste reagiert werden. Dies würde dann aber eine Änderung in der Competition List und wieder in der Mannschafts Liste hervorrufen usw.... Man würde also ein Endlosschleife bekommen. Meine Frage ist eiegentlich ein Ansatz wie man das verhindert.

Meine erste Idee : Einen Anderen Listener zu verwenden, der nicht auf die geänderten ListElements reagiert sondern eher auf einen Klick in der Liste, dann wüsste man von welcher Liste man starten kann : Also z.B. :

Klick in Competition List
-> änderung in TeamList und MemberList

Klick in TeamList
-> änderung in CompetitionList und MemberList

...

Die Änderungen würden dann nur in der Liste gemacht und hätten keinen Abhängigkeiten

Vielen Dank für weitere Hinweise
 
Zuletzt bearbeitet:

truesoul

Top Contributor
Hallo.

Also ich kann mir vorstellen, wie du schon erwähntest, einen anderen Listener zu verwenden.

Ich habe mit JavaFX nicht so viel gemacht aber ich würde mir die Doku durchlesen und schauen welche Listener für welchen Zweck gut ist. Ein Klicklistener wird dafür eher ungeeignet sein. Listener wie ChangeListener oder sowas kann ich mir vorstellen. Also dein Listener reagiert nur auf den Inhalt, wenn der sich ändert.

Grüße
 

Ähnliche Java Themen


Oben