由于“重复的TableColumns”(JAVAFX)

时间:2019-01-12 15:14:04

标签: java javafx tableview fxml

我正在尝试将我的ObservableList中的数据显示到我在SceneBuilder中创建的TableView中。 TableView包含三个TableColumns。我给他们提供了与FXML文件完全相同的名称。

我已将它们导入到Controller中,就像您在[1]下方看到的一样

然后我尝试运行我的代码。我基本上有一首歌。这首歌包括标题,艺术家和专辑。我想在每列上显示它,但它一直在抱怨:

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

1 个答案:

答案 0 :(得分:2)

您的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方法进行所有列创建。