Как изменить элементы ComboBox при изменении значения другого? - PullRequest
0 голосов
/ 26 июня 2019

Я делаю небольшой проект, который управляет альбомами певца, поэтому проект предоставляет вам возможность добавить нового певца, чтобы добавить альбом для конкретного певца и добавить песни в определенный альбом для конкретного певца, и я пытаюсь заставить пользователя шанс получить альбомы певца, чтобы ему не приходилось печатать его рукой, поэтому я использовал два ComboBox один с именем «AvailableSinger», который явно для доступного певца, и другой «AlbumAvailable» для доступных альбомов для каждого певца, когда Если пользователь выберет певца, в «AlbumAvailable» отобразятся альбомы певца, выбранного в «AvailableSinger»

Я добавил двух исполнителей "Adele" и "Eminem", но когда я выберу Eminem, альбом "Adele" "Hello" будет отображаться только.

package sample;

import MusicManiPulation.Album;
import MusicManiPulation.Singer;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;

import java.util.ArrayList;

public class AddSongsToAlbum {

@FXML
ComboBox<String> AvailableSinger ;
@FXML
ComboBox<Album> AlbumAvailble ;

public void initialize(){
    AvailableSinger.getItems().addAll(Singer.getInstance().GetSingerNames());
    AvailableSinger.getSelectionModel().selectFirst();
    ArrayList<Album> AlbumList =Singer.getInstance().getAlbumNameoforSinger(AvailableSinger.getSelectionModel().getSelectedItem());
    AlbumAvailble.getItems().addAll(AlbumList);

}


}

Singer Class (если вы хотите понять, что я делаю)

package MusicManiPulation;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class Singer {

   public static Singer Instance = new Singer();

    Map<String , ArrayList<Album>>AlbumListfoEachSinger ;

    private Singer() {
        this.AlbumListfoEachSinger = new HashMap<>();
    }

  public ArrayList<String> GetSingerNames(){
        ArrayList<String>SingerName = new ArrayList<>();
        SingerName.addAll(AlbumListfoEachSinger.keySet());
        return SingerName;
  }


    public Map<String, ArrayList<Album>> getAlbumListfoEachSinger() {
        return AlbumListfoEachSinger;
    }


    public ArrayList<Album> getAlbumNameoforSinger(String SingerName){
        return AlbumListfoEachSinger.get(SingerName);
    }

    public static Singer getInstance() {
        return Instance;
    }
}

Adele Album Displaying Picture

When Selecting Eminem

Как видно, отображается только альбом Adele, но при выборе другого исполнителя он не работает.

1 Ответ

2 голосов
/ 26 июня 2019

Во-первых, вы должны уделять больше внимания соглашениям об именах в Java. Проверьте этот ресурс .

Вы можете решить свою проблему, используя одним из следующих способов :

  • Слушателей :

Слушатели могут быть добавлены в свойства JavaFX, вы можете добавить слушателя, который будет заполнять альбомы для конкретного певца, когда выбран новый певец. Добавьте этот слушатель в ваш метод инициализации:

availableSingers.valueProperty().addListener((observable, oldSelectedSinger, newSelectedSinger) -> {
    List<Album> albums = Singer.getInstance().getAlbumNameoforSinger(newSelectedSinger);
    availableAlbums.getItems().setAll(albums);
});
  • Наручники

Вы можете привязать элементы списка со списком альбомов к выбранному значению поля со списком певца. Добавьте этот слушатель в ваш метод инициализации:

availableAlbums.itemsProperty().bind(Bindings.createObjectBinding(() -> {
    List<Album> albums = Singer.getInstance().getAlbumNameoforSinger(availableSingers.getValue());
    return FXCollections.observableArrayList(albums);
}, availableSingers.valueProperty()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...