我已经在JavaFX pursuant to this answer中创建了一个自定义表格单元格,因此我可以为单元格文本的不同部分使用不同的字体样式。
我将此自定义表格单元格用于两种不同类型的TableView:TableView<Track>
和TableView<Album>
。
Track
和Album
都实现了接口AlbumInfoSource
:
public interface AlbumInfoSource {
public String getAlbumTitle();
public String getFullAlbumTitle();
public String getReleaseType();
public String getDiscSubtitle();
public Integer getDiscCount();
public Integer getDiscNumber();
}
我的自定义TableCell是使用该AlbumInfoSource键入的,因此它可以呈现TableView<Album>
和TableView<Track>
的单元格。
这是基本代码:
public class FormattedAlbumCell<T, S> extends TableCell <AlbumInfoSource, String> {
private TextFlow flow;
private Label albumName, albumType, albumDisc;
public FormattedAlbumCell () {
/* Do constructor stuff */
}
@Override
protected void updateItem ( String text, boolean empty ) {
super.updateItem ( text, empty );
/* Do pretty rendering stuff */
}
}
然后将其应用于这样的列:
TableColumn<Album, String> albumColumn;
albumColumn = new TableColumn<Album, String>( "Album" );
albumColumn.setCellFactory( e -> new FormattedAlbumCell () );
哪个可以很好地运行,但我在最后一行收到警告,提示:
警告:FormattedAlbumCell是原始类型。泛型类型FormattedAlbumCell
的引用应参数化
如果我将FormattedAlbumCell类更改为扩展TableCell <Album, String>
,则警告消失。但是然后我不能将FormattedAlbumCell用于TableView<Track>
,我将不得不复制FormattedAlbumCell类以使其扩展TableCell,这对我来说似乎很愚蠢。
是否有一种方法可以直接获得这些参数而不创建两个单独的类?看来问题出在与接口有关的参数化方面。
答案 0 :(得分:7)
您的FormattedAlbumCell
有两个通用类型参数(<T, S>
),从外观上看,它们是完全未使用的。删除它们。
class FormattedAlbumCell<T, S> extends TableCell<AlbumInfoSource, String>
成为
class FormattedAlbumCell extends TableCell<AlbumInfoSource, String>
您的下一个问题是generics are invariant。 TableCell<AlbumInfoSource, String>
不是TableCell<Album, String>
,反之亦然。
如果您需要能够在方法中创建TableColumn<Album, String>
,则需要TableCell<Album...
,而不是TableCell<AlbumInfoSource...
。但是您还希望此方法适用于AlbumInfoSource
的其他实现,因此更改单元格将无效。
这意味着您需要通过泛型引入另一个间接级别。
class FormattedAlbumCell<T extends AlbumInfoSource> extends TableCell<T, String>
这表示我们可以创建FormattedAlbumCell
的不同通用版本,但要遵守T
是AlbumInfoSource
的更具体类型(即扩展或实现)的约束。
现在我们可以创建一个FormattedAlbumCell<Track>
的{{1}},或者我们可以创建一个TableCell<Track, String>
的{{1}}。