由于 "Duplicate TableColumns" (JAVAFX),ObservableList 不会显示在 TableView 上
ObservableList will not display on TableView because of "Duplicate TableColumns" (JAVAFX)
我正在尝试将 ObservableList 中的数据显示到我在 SceneBuilder 中创建的 TableView 中。 TableView 包含三个 TableColumns。我给了他们与 FXML-file 中完全相同的名称。
我已经将它们导入到控制器中,如下所示 [1]
然后我尝试 运行 我的代码。我基本上有一首歌。这首歌由标题、艺术家和专辑组成。我想在每一列上显示它,但它一直抱怨:
在标题为 'Song title'、'Artist'、'Album' 的 TableView 列列表中检测到重复的 TableColumns。
然后崩溃。
有人知道我做错了什么吗?
@FXML
private TableView<Song> defaultTableView;
// 1) Song Title
@FXML
private TableColumn songTitleColumn;
// 2) Song artist
@FXML
private TableColumn songArtistColumn;
// 3) Song album
@FXML
private TableColumn songAlbumColumn;
public void initialize(URL location, ResourceBundle resources) {
Song song1 = new Song("a lot.mp3");
Song song2 = new Song("Work Out.mp3");
Song song3 = new Song("Jesus Walks.mp3");
Playlist myPlaylist = new Playlist("My awesome playlist");
myPlaylist.addSong(song1);
myPlaylist.addSong(song2);
song1.getSongTitleFromDB();
song1.getSongArtistFromDB();
song1.getSongAlbumFromDB();
myPlaylist.displayAllSongs(defaultTableView,songTitleColumn,songArtistColumn,songAlbumColumn);
ObservableList<Song> songs = FXCollections.observableArrayList();
songs.add(song1);
songTitleColumn.setCellFactory(new PropertyValueFactory<Song,String>("songTitle"));
songArtistColumn.setCellFactory(new PropertyValueFactory<Song, String>("songArtist"));
songAlbumColumn.setCellFactory(new PropertyValueFactory<Song, String>("songAlbum"));
defaultTableView.setItems(songs);
defaultTableView.getColumns().addAll(songTitleColumn,songArtistColumn,songAlbumColumn);
您的 fxml 文件如下所示:
<TableView fx:id="defaultTableView">
<columns>
<TableColumn fx:id="songTitleColumn"/>
<TableColumn fx:id="songArtistColumn"/>
<TableColumn fx:id="songAlbumColumn"/>
</columns>
</TableView>
由于 columns
是一个只读列表 属性,加载 fxml 文件会导致将列添加到 TableView
。再次尝试将它们添加到 TableView
会导致异常。
您在 initialize
方法中执行此操作:
defaultTableView.getColumns().addAll(songTitleColumn, songArtistColumn, songAlbumColumn);
您需要删除此 link 或在 initialize
方法中创建 所有 列。
我正在尝试将 ObservableList 中的数据显示到我在 SceneBuilder 中创建的 TableView 中。 TableView 包含三个 TableColumns。我给了他们与 FXML-file 中完全相同的名称。
我已经将它们导入到控制器中,如下所示 [1]
然后我尝试 运行 我的代码。我基本上有一首歌。这首歌由标题、艺术家和专辑组成。我想在每一列上显示它,但它一直抱怨:
在标题为 'Song title'、'Artist'、'Album' 的 TableView 列列表中检测到重复的 TableColumns。
然后崩溃。
有人知道我做错了什么吗?
@FXML
private TableView<Song> defaultTableView;
// 1) Song Title
@FXML
private TableColumn songTitleColumn;
// 2) Song artist
@FXML
private TableColumn songArtistColumn;
// 3) Song album
@FXML
private TableColumn songAlbumColumn;
public void initialize(URL location, ResourceBundle resources) {
Song song1 = new Song("a lot.mp3");
Song song2 = new Song("Work Out.mp3");
Song song3 = new Song("Jesus Walks.mp3");
Playlist myPlaylist = new Playlist("My awesome playlist");
myPlaylist.addSong(song1);
myPlaylist.addSong(song2);
song1.getSongTitleFromDB();
song1.getSongArtistFromDB();
song1.getSongAlbumFromDB();
myPlaylist.displayAllSongs(defaultTableView,songTitleColumn,songArtistColumn,songAlbumColumn);
ObservableList<Song> songs = FXCollections.observableArrayList();
songs.add(song1);
songTitleColumn.setCellFactory(new PropertyValueFactory<Song,String>("songTitle"));
songArtistColumn.setCellFactory(new PropertyValueFactory<Song, String>("songArtist"));
songAlbumColumn.setCellFactory(new PropertyValueFactory<Song, String>("songAlbum"));
defaultTableView.setItems(songs);
defaultTableView.getColumns().addAll(songTitleColumn,songArtistColumn,songAlbumColumn);
您的 fxml 文件如下所示:
<TableView fx:id="defaultTableView">
<columns>
<TableColumn fx:id="songTitleColumn"/>
<TableColumn fx:id="songArtistColumn"/>
<TableColumn fx:id="songAlbumColumn"/>
</columns>
</TableView>
由于 columns
是一个只读列表 属性,加载 fxml 文件会导致将列添加到 TableView
。再次尝试将它们添加到 TableView
会导致异常。
您在 initialize
方法中执行此操作:
defaultTableView.getColumns().addAll(songTitleColumn, songArtistColumn, songAlbumColumn);
您需要删除此 link 或在 initialize
方法中创建 所有 列。