JavaFX中TableView播放按钮ImageView无法显示问题求助
我需要在从数据库加载的每个曲目前面绘制一个ImageView(播放按钮),但不知为何它加载不出来。没有发生错误,但按钮就是没有添加到加载曲目的那一行中。我已经尝试了所有可能的方法,也许有人能告诉我哪里出了问题?
附上我的代码:
@Override public void initialize(URL fxmlFileLocation, ResourceBundle resources) { try { column_track.setCellValueFactory(new PropertyValueFactory<>("title")); column_artist.setCellValueFactory(new PropertyValueFactory<>("artist")); column_genre.setCellValueFactory(new PropertyValueFactory<>("genre")); column_duration.setCellValueFactory(new PropertyValueFactory<>("duration")); column_play.setCellFactory(new Callback<TableColumn<Track, ImageView>, TableCell<Track, ImageView>>() { @Override public TableCell<Track, ImageView> call(TableColumn<Track, ImageView> param) { return new TableCell<Track, ImageView>() { private final ImageView imageView = new ImageView(); @Override protected void updateItem(ImageView item, boolean empty) { super.updateItem(item, empty); if (empty || item == null) { setGraphic(null); } else { imageView.setImage(new Image("images/icon-play-gray.png")); imageView.setFitWidth(50); imageView.setFitHeight(50); setGraphic(imageView); } } }; } }); table_tracks.setItems(trackList); loadTracks(); } catch (Exception e) { e.printStackTrace(); } }
我帮你排查几个核心问题点,应该能解决按钮不显示的问题:
CellValueFactory缺失导致item始终为null
你只给column_play设置了cellFactory,但没有配置cellValueFactory,这会让updateItem里的item一直是null,直接触发了setGraphic(null)的逻辑。其实播放按钮这种不需要绑定数据的列,完全不用依赖item,只要当前行不是空行就可以显示按钮。
建议修改代码:把TableColumn的泛型改成Track, Void,同时调整updateItem的逻辑,去掉对item的判断:column_play.setCellFactory(new Callback<TableColumn<Track, Void>, TableCell<Track, Void>>() { @Override public TableCell<Track, Void> call(TableColumn<Track, Void> param) { return new TableCell<Track, Void>() { private final ImageView imageView = new ImageView(); @Override protected void updateItem(Void item, boolean empty) { super.updateItem(item, empty); if (empty) { setGraphic(null); } else { // 加载图片并设置样式 imageView.setImage(new Image(getClass().getResource("/images/icon-play-gray.png").toExternalForm())); imageView.setFitWidth(50); imageView.setFitHeight(50); setGraphic(imageView); } } }; } });图片路径加载逻辑有问题
直接用new Image("images/icon-play-gray.png")容易出现资源找不到的情况,而且JavaFX默认会静默加载失败(不抛出异常),导致你看不到报错信息。如果你的images文件夹放在src/main/resources目录下,一定要用getResource来获取正确的资源URL,这样如果路径错误会直接抛出异常,方便你排查。列宽可能不足以显示按钮
检查一下column_play的宽度设置,默认列宽可能太小,导致50x50的按钮被隐藏。可以在代码里加一行column_play.setPrefWidth(60);,给按钮留出足够的显示空间。
你可以先试试这些修改,应该就能看到播放按钮正常显示了。
备注:内容来源于stack exchange,提问作者Pavel Senior

