いくつかの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 );
}
}
リフレクション(「HERE IT IS」コメントでフラグ付け)を使用して、Javaフィールド名でフィールドの値を取得することはできますが、「使用法」セクションにコードを追加せずに、別の方法で行いたいと考えています。
リフレクションを使用せずに、(コードを使用して) 他の方法を提案できますか?
どんな助けでも感謝します。