ObservableList не будет отображаться в TableView из-за «Duplicate TableColumns» (JAVAFX) - PullRequest
0 голосов
/ 12 января 2019

Я пытаюсь отобразить данные из моего ObservableList в TableView, который я создал в SceneBuilder. TableView содержит три TableColumns. Я дал им то же имя, что и в FXML-файле.

Я импортировал их в контроллер, как вы можете видеть ниже [1]

А потом я пытаюсь запустить свой код. У меня в основном есть песня. Песня состоит из названия, исполнителя и альбома. Я хочу отобразить его в каждом столбце, но он продолжает жаловаться на:

В списке столбцов TableView обнаружены повторяющиеся столбцы таблицы с названиями «Название песни», «Исполнитель», «Альбом».

А потом вылетает.

Кто-нибудь знает, что я делаю не так?

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

1 Ответ

0 голосов
/ 12 января 2019

Ваш файл 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);

Вам необходимо удалить эту ссылку или выполнить все создание столбца в методе initialize.

...