java - 当另一个 ComboBox 的值更改时,如何更改 ComboBox 的项目?
问题描述
我正在做一个操作歌手专辑的小项目,因此该项目为您提供了添加新歌手以添加特定歌手的专辑并将歌曲添加到特定歌手的特定专辑,我试图让用户有机会获得歌手专辑,所以他不必用手打字,所以我使用了两个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;
}
}
如您所见,仅显示 Adele 专辑,但在选择其他艺术家时,它不起作用。
解决方案
首先,您必须更加注意 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()));
推荐阅读
- python - python中的无效语法在范围内
- python-3.x - 正则表达式逻辑错误。验证电话号码
- xamarin.forms - xamarin 表单按钮文本换行到 2 行
- react-native - 在本机反应中遇到变量(this.x)问题
- asp.net - 我在 asp.net c# 中的购物卡项目出现 da.Fill(ds) 错误
- facebook - 如何在网站上应用 iframe 视频链接?
- html - 如何在 Angular 的模板中编写标签及其属性组合在一起?
- html - 为什么我的任何 CSS 样式都没有应用于我的导航区域中的任何项目?
- python - 错误:在 pycharm 中“没有为 opencv-python 找到匹配的分布”
- google-cloud-platform - 如何为没有外部 IP 的 Windows 虚拟机创建 IAP 隧道