Неизвестное количество кнопок, как добавить различные действия события для каждого JavaFX - PullRequest
0 голосов
/ 11 марта 2020

У меня есть JavaFX GUI, который создает и добавляет количество кнопок в зависимости от количества команд, они хранятся в ArrayList, это число варьируется.

У каждой команды есть список людей в списке.

Моя проблема в том, что я хочу написать какую-то логи c, чтобы без предварительного знания я мог добавить список кнопок, и при нажатии каждая из них будет отображать свои различные списки.

        Button getTeamsButton = new Button( "Load Teams and Details" );
        getTeamsButton.setOnAction( e -> {
        getTeams.scrapeTeams();
            if( !getTeams.getTeams().isEmpty() )                      
            {             

                for( int i = 0; i < getTeams.getTeams().size(); i++ )
                {
                            Button teamName = new Button( getTeams.getTeams().get(i).getTeamName()  );
        teamNamesButtons.add( teamName );
        layout1.getChildren().add( teamNamesButtons.get( i ) );

                }

Я могу создать кнопки.

                getTeamsButton.setDisable( true );
                teamNamesButtons.get( 0 ).setOnAction( f -> {
                    for(int i = 0; i < getTeams.getTeams().get( 0 ).getRoster().size(); i++) {
                        System.out.println(getTeams.getTeams().get( 0 ).getRoster().get( i ));
                    }
                });                    
            }
        } );

И если я укажу, какой элемент в списке я могу напечатать реестр, как я объясню логику c верхней кнопки - команда 0, секунда это команда 1, et c et c?

Любой совет будет высоко ценится?

1 Ответ

3 голосов
/ 11 марта 2020

Не совсем понятно, о чем вы спрашиваете, но, возможно, это помогает.

Вы уже «знаете», когда создаете кнопку, индекс которой она имеет: индекс задается как i. Так что вам просто нужно создать обработчик событий, который ссылается на это значение. Единственный улов здесь заключается в том, что вы не можете ссылаться на неконечную переменную (или переменную, которую нельзя сделать окончательной, просто добавив ключевое слово final) в лямбда-выражении, поэтому вам может потребоваться скопировать ее в конечная переменная.

Например:

Button getTeamsButton = new Button( "Load Teams and Details" );
getTeamsButton.setOnAction( e -> {
    getTeams.scrapeTeams();
    if( !getTeams.getTeams().isEmpty() ) {             
        for( int i = 0; i < getTeams.getTeams().size(); i++ ) {
            Button teamName = new Button( 
                 getTeams.getTeams().get(i).getTeamName()  );
            teamNamesButtons.add( teamName );
            layout1.getChildren().add( teamNamesButtons.get( i ) );

            final int index = i ;
            teamName.setOnAction(evt -> {
                for (int j = 0 ; j < getTeams.getTeams().get(index).getRoster().size(); j++) {
                    System.out.println(getTeams.getTeams().get(index).getRoster().get( j ));
                }
            });
        }
    }
});

Хотя вам, вероятно, индекс не нужен; просто соответствующие данные. Вы не показали, что на самом деле есть в ваших списках, но, если вы определили какой-то класс Team, вы можете сделать это намного чище с помощью

Button getTeamsButton = new Button( "Load Teams and Details" );
getTeamsButton.setOnAction( e -> {
    getTeams.scrapeTeams();
    // the if statement here is redundant, if the list is
    // empty, the for loop will just iterate zero times....     
    for( int i = 0; i < getTeams.getTeams().size(); i++ ) {
        Team team = getTeams.getTeams().get(i);
        Button teamName = new Button(team.getTeamName());
        teamNamesButtons.add(teamName);
        layout1.getChildren().add(teamName);

        teamName.setOnAction(evt -> {
            for (int j = 0 ; j < team.getRoster().size(); j++) {
                System.out.println(team.getRoster().get( j ));
            }
        });
    }
});

или, используя предпочтительный синтаксис

Button getTeamsButton = new Button( "Load Teams and Details" );
getTeamsButton.setOnAction( e -> {
    getTeams.scrapeTeams();
    for( Team team : getTeams.getTeams()) {
         Button teamName = new Button(team.getTeamName());
         teamNamesButtons.add(teamName);
         layout1.getChildren().add(teamName);

         teamName.setOnAction(evt -> {
             for (Player player : team.getRoster) {
                  System.out.println(player);
             }
         });
     }
});

(Вам даже не нужен список teamNamesButtons ... обратите внимание, что он больше не нужен в приведенном выше коде.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...