Java FX:如何在没有匿名内部的情况下重写 RowFactory class - Java 8 兼容
Java FX: How to rewrite a RowFactory without an anonymous inner class - Java 8 Compatible
我目前正在设置我的项目以使用 Java 8。由于限制,这是 Java 当前最高版本,我可以 运行。从我之前的 Java 11 配置转换为 Java 时,我 运行 出现以下问题:
playlistDetailsTable.setRowFactory(tv -> new TableRow<>() {
^
reason: '<>' with anonymous inner classes is not supported in -source 8
(use -source 9 or higher to enable '<>' with anonymous inner classes)
where T is a type-variable:
T extends Object declared in class TableRow
这是失败的当前代码块。如果播放列表已停用,这只会突出显示 table 行。
playlistDetailsTable.setRowFactory(tv -> new TableRow<>() {
@Override
protected void updateItem(Map item, boolean empty) {
super.updateItem(item, empty);
ObservableList<String> styles = getStyleClass();
if (item == null ) {
setStyle("");
} else {
final String currentPlaylistRow = (String)item.get(PlaylistBreakdownEnum.PLAYLIST.getColName()) ;
final String cleanPlaylistString = currentPlaylistRow.replaceAll("\(.*\)", "").stripTrailing();
if (PlaylistEnum.getEnumByPlaylist(cleanPlaylistString).getRetired()) {
getStyleClass().add("retired-row");
}
else {
getStyleClass().removeAll("retired-row");
}
}
}
});
有谁知道如何有效地解决这个问题?
您的问题不是由使用匿名引起的class。问题是,due to reasons,您不能在 Java 7 或 8 中使用带有匿名 classes 的菱形运算符。该功能直到 Java 9 才添加。由于你正在使用 Java 8 你必须更新你的代码以使通用类型明确。
例如,而不是使用:
playlistDetailsTable.setTableRow(tv -> new TableRow<>() {
// custom TableRow implementation
});
你必须使用:
playlistDetailsTable.setTableRow(tv -> new TableRow<YOUR_TYPE_HERE>() {
// custom TableRow implementation
});
将 YOUR_TYPE_HERE
替换为 TableView
使用的类型。换句话说,如果您的 playlistDetailsTable
是 TableView<Playlist>
那么您将使用 TableRow<Playlist>
.
我目前正在设置我的项目以使用 Java 8。由于限制,这是 Java 当前最高版本,我可以 运行。从我之前的 Java 11 配置转换为 Java 时,我 运行 出现以下问题:
playlistDetailsTable.setRowFactory(tv -> new TableRow<>() {
^
reason: '<>' with anonymous inner classes is not supported in -source 8
(use -source 9 or higher to enable '<>' with anonymous inner classes)
where T is a type-variable:
T extends Object declared in class TableRow
这是失败的当前代码块。如果播放列表已停用,这只会突出显示 table 行。
playlistDetailsTable.setRowFactory(tv -> new TableRow<>() {
@Override
protected void updateItem(Map item, boolean empty) {
super.updateItem(item, empty);
ObservableList<String> styles = getStyleClass();
if (item == null ) {
setStyle("");
} else {
final String currentPlaylistRow = (String)item.get(PlaylistBreakdownEnum.PLAYLIST.getColName()) ;
final String cleanPlaylistString = currentPlaylistRow.replaceAll("\(.*\)", "").stripTrailing();
if (PlaylistEnum.getEnumByPlaylist(cleanPlaylistString).getRetired()) {
getStyleClass().add("retired-row");
}
else {
getStyleClass().removeAll("retired-row");
}
}
}
});
有谁知道如何有效地解决这个问题?
您的问题不是由使用匿名引起的class。问题是,due to reasons,您不能在 Java 7 或 8 中使用带有匿名 classes 的菱形运算符。该功能直到 Java 9 才添加。由于你正在使用 Java 8 你必须更新你的代码以使通用类型明确。
例如,而不是使用:
playlistDetailsTable.setTableRow(tv -> new TableRow<>() {
// custom TableRow implementation
});
你必须使用:
playlistDetailsTable.setTableRow(tv -> new TableRow<YOUR_TYPE_HERE>() {
// custom TableRow implementation
});
将 YOUR_TYPE_HERE
替换为 TableView
使用的类型。换句话说,如果您的 playlistDetailsTable
是 TableView<Playlist>
那么您将使用 TableRow<Playlist>
.