【问题标题】:How to Change the items of a ComboBox when a value of another is changed?当另一个 ComboBox 的值更改时,如何更改 ComboBox 的项目?
【发布时间】:2019-11-07 18:39:55
【问题描述】:

我正在做一个操作歌手专辑的小项目,因此该项目提供您添加新歌手以添加特定歌手的专辑并将歌曲添加到特定歌手的特定专辑,我试图让用户有机会获得歌手专辑,这样他就不必用手打字了,所以我使用了两个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);

}


}

歌手班(如果你想了解我在做什么)

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;
    }
}

您只能看到阿黛尔专辑显示,但选择其他艺术家时它不起作用。

【问题讨论】:

  • javafx.beans.value.ChangeListener 添加到ComboBoxvalue 属性,并根据需要更改其他ComboBox 的项目。
  • 看起来很简单 xD 但我不知道如何很好地覆盖它

标签: java javafx combobox


【解决方案1】:

首先,您必须更加注意 Java 中的命名约定。检查这个resource

您可以使用以下方法之一解决您的问题:

  • 听众

Listeners can be added to JavaFX properties, you can add a listener that will fill the albums for a specific singer when a new singer is selected.在你的初始化方法中添加这个监听器:

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()));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 2015-11-12
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多