我已经根据这个答案在JavaFX中创建了一个自定义表格单元格,因此我可以为单元格文本的不同部分设置不同的字体样式.
我在两种不同类型的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();
}
Run Code Online (Sandbox Code Playgroud)
我的自定义TableCell使用该AlbumInfoSource键入,因此它可以为a TableView<Album>和a 渲染单元格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 */
}
}
Run Code Online (Sandbox Code Playgroud)
然后我将它应用于这样的列:
TableColumn<Album, String> albumColumn;
albumColumn = new TableColumn<Album, String>( "Album" );
albumColumn.setCellFactory( e -> new FormattedAlbumCell () );
Run Code Online (Sandbox Code Playgroud)
哪个工作得很好,但我在最后一行收到警告,其中说:
警告:FormattedAlbumCell是原始类型.应参数化对泛型类型FormattedAlbumCell <T,S>的引用
如果我更改我的FormattedAlbumCell类使其扩展TableCell <Album, String>,那么警告就会消失.但是后来我不能使用FormattedAlbumCell了TableView<Track>,我不得不复制FormattedAlbumCell类使它扩展TableCell,这对我来说似乎是愚蠢的.
有没有办法直接获得这些参数而不创建两个单独的类?看起来这个问题来自于接口故障的参数化问题.
你FormattedAlbumCell有两个泛型类型参数(<T, S>),根据事物的外观,它们是完全未使用的.删除它们.
class FormattedAlbumCell<T, S> extends TableCell<AlbumInfoSource, String>
Run Code Online (Sandbox Code Playgroud)
变
class FormattedAlbumCell extends TableCell<AlbumInfoSource, String>
Run Code Online (Sandbox Code Playgroud)
你的下一个问题是泛型是不变的.A TableCell<AlbumInfoSource, String>不是TableCell<Album, String>,反之亦然.
如果你需要能够TableColumn<Album, String>在你的方法中创建一个,那么你需要一个TableCell<Album...,而不是一个TableCell<AlbumInfoSource....但是您也希望这适用于其他实现AlbumInfoSource,因此更改单元格将无法正常工作.
这意味着您需要通过泛型引入另一级别的间接.
class FormattedAlbumCell<T extends AlbumInfoSource> extends TableCell<T, String>
Run Code Online (Sandbox Code Playgroud)
这表示我们可以创建不同的泛型版本FormattedAlbumCell,受限于T更具体类型的约束AlbumInfoSource(即扩展或实现它).
现在,我们可以创建一个FormattedAlbumCell<Track>这将是一个TableCell<Track, String>,或者我们可以创建一个FormattedAlbumCell<Album>,这将是一个TableCell<Album, String>.
另请参阅Oracle的泛型教程
| 归档时间: |
|
| 查看次数: |
101 次 |
| 最近记录: |