-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 );
   }
}

リフレクション(「HERE IT IS」コメントでフラグ付け)を使用して、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 に答える