我在尝试迭代JavaFX TableView
的列时遇到了这个问题。我想调用每个列的cellFactory
,所以我做了类似的事情 -
for (TableColumn<Model, ?> column : getTableView().getColumns()) {
column.getCellFactory().call(column);
}
不幸的是,这不起作用,因为我收到了编译错误:
不兼容的类型:javafx.scene.control.TableColumn&lt;模型,捕获#1? &GT;无法转换为javafx.scene.control.TableColumn&lt;模型,捕获#2? &GT;
我怎样才能克服这一点?我可以投射参数吗?介绍显式类型参数?
这些列自然不是完全相同的类型,我非常希望避免对每列的类型进行硬编码,因为此代码应该用于各种TableView
s。
答案 0 :(得分:3)
如果您不想创建新类,可以使用通用静态方法
public static<T> void callCellFactory(TableColumn<Model,T> column){
column.getCellFactory().call(column);
}
然后将使用相同的类型T对列和cellFactory()进行参数化。
您将能够将该函数用于具有通配符的对象:
for (TableColumn<Model, ?> column : tableView.getColumns()) {
callCellFactory(column);
}
答案 1 :(得分:2)
您可以删除generics参数并禁止rawtypes警告
for (@SuppressWarnings("rawtypes") TableColumn column : getTableView().getColumns()) {
column.getCellFactory().call(column); // now compiles
}
答案 2 :(得分:1)
如果您能够扩展holder.txt_msg_user.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
if (holder.txt_date_user.isShown() && holder.txt_AM_user.isShown())
{
holder.usertimelayout.setVisibility(View.GONE);
holder.txt_date_user.setVisibility(View.GONE);
holder.txt_AM_user.setVisibility(View.GONE);
}
else
{
holder.usertimelayout.setVisibility(View.VISIBLE);
holder.txt_date_user.setVisibility(View.VISIBLE);
holder.txt_AM_user.setVisibility(View.VISIBLE);
}
}
});
类,则可以添加如下所示的方法:
TableColumn
这使您可以在不需要知道第二个通用的确切类别的情况下进行调用。您需要为每个列执行的操作是调用非泛型方法public void callCellFactory() {
this.getCellFactory().call(this);
}
,并且类的内部泛型将为您处理调用。
请注意,您还需要使用新类而不是callCellFactory()
的可迭代来获取迭代。