-1

写了几个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 字段名称获取字段的值是可行的,但我希望不这样做,而不在“使用”部分添加代码。

您能否提出其他方法(使用代码),而不使用反射?

任何帮助表示赞赏。

4

1 回答 1

0

您可以创建一个接口

public interface Property<T, X>  {
    public X get(T object);
    public void set(T object, X value);
}

该接口Property可以在您当前使用反射的地方使用:

public static <T,F> void addColumn(
        TableView<T> table,
        TableColumn<T, F> column,
        final Property<T, ObservableValue<F>> property,
        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();
            return property.get(t);
         }
      });
   column.setSortable( sortable );
   column.setPrefWidth( width );
   table.getColumns().add( column );
}

好吧,要么这个,要么我遗漏了一些说这不能用 JavaFX 完成的东西。

于 2012-11-12T22:36:21.230 回答