写了几个javafx.scene.control.TableView后,看到代码很繁琐,我把这个实用程序做成了静态函数:
public class TableViewHelper {
public static <T,F> void addColumn(
TableView<T> table,
TableColumn<T,F> column,
final String fieldName,
boolean sortable,
double width )
{
column.setCellValueFactory(
new Callback< CellDataFeatures<T,F>, ObservableValue< F >>(){
@Override public ObservableValue< F > call( CellDataFeatures<T,F> p ){
T t = p.getValue();
ObservableValue< F > value = null;
/*HERE IT IS*/ Class<T> tc = (Class<T>)t.getClass();
/*HERE IT IS*/ try { value = (ObservableValue<F>)(tc.getDeclaredField( fieldName ).get( t )); }
/*HERE IT IS*/ catch( Throwable x ){ x.printStackTrace(); }
return value;
}});
column.setSortable( sortable );
column.setPrefWidth( width );
table.getColumns().add( column );
}
}
表行类:
public class ChatMessage {
public ChatMessage( String sender, String message ) {
_date .set( new Date());
_sender .set( sender );
_message.set( message );
}
final SimpleObjectProperty< Date > _date = new SimpleObjectProperty<>();
final SimpleStringProperty _sender = new SimpleStringProperty();
final SimpleStringProperty _message = new SimpleStringProperty();
}
用法:
public class ChatView
extends
BorderPane
{
ChatView() {
TableViewHelper.addColumn(
_view, new TableColumn<ChatMessage,Date >( "Date" ), "_date" , 100.0 );
TableViewHelper.addColumn(
_view, new TableColumn<ChatMessage,String>( "Sender" ), "_sender" , 100.0 );
TableViewHelper.addColumn(
_view, new TableColumn<ChatMessage,String>( "Message" ), "_message", 1200.0 );
setCenter( _view );
}
}
使用反射(由“这里是”注释标记)通过它们的 Java 字段名称获取字段的值是可行的,但我希望不这样做,而不在“使用”部分添加代码。
您能否提出其他方法(使用代码),而不使用反射?
任何帮助表示赞赏。