2012-07-10 29 views
8
TableColumn<Event,Date> releaseTime = new TableColumn<>("Release Time"); 
    releaseTime.setCellValueFactory(
       new PropertyValueFactory<Event,Date>("releaseTime") 
      ); 

releaseTimeの形式を変更するにはどうすればよいですか?現時点では、Dateオブジェクトに対して単純なtoStringを呼び出します。JavaFXテーブルセルの書式設定

答えて

5

私は最近、これを行うために必要な -

dateAddedColumn.setCellValueFactory(
    new Callback<TableColumn.CellDataFeatures<Film, String>, ObservableValue<String>>() { 
     @Override 
     public ObservableValue<String> call(TableColumn.CellDataFeatures<Film, String> film) { 
     SimpleStringProperty property = new SimpleStringProperty(); 
     DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); 
     property.setValue(dateFormat.format(film.getValue().getCreatedDate())); 
     return property; 
     } 
    }); 

しかし - それは、ラムダ式を使用してJava 8でたくさん簡単です:

dateAddedColumn.setCellValueFactory(
    film -> { 
     SimpleStringProperty property = new SimpleStringProperty(); 
     DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); 
     property.setValue(dateFormat.format(film.getValue().getCreatedDate())); 
     return property; 
    }); 

は、Javaの8のリリースのOracleと急いで!

+1

これは、モデルの日付プロパティがSimpleStringPropertyより遅く変更され、通知が発行されず、テーブルが更新されない場合に、テーブルの初期設定に適しています。 – Adam

7

TableColumnのソート機能を保持する場合は、上記のいずれのソリューションも有効ではありません。DateをStringに変換してTableViewに表示すると、テーブルはそのように(誤って)ソートします。

私が見つけた解決策は、toString()メソッドをオーバーライドするために、Dateクラスをサブクラス化することでした。ただし、ここでは注意が必要です。TableViewはjava.util.Dateではなくjava.sql.Dateを使用します。前者をサブクラス化する必要があります。

import java.text.SimpleDateFormat; 

public class CustomDate extends java.sql.Date { 

    public CustomDate(long date) { 
     super(date); 
    } 

    @Override 
    public String toString() { 
     return new SimpleDateFormat("dd/MM/yyyy").format(this); 
    } 
} 

テーブルは、このメソッドを呼び出して日付を印刷します。

もちろん、あなたが新しいサブクラスにTableColumnの宣言でもあなたのDateクラスを変更する必要があります:あなたはあなたのテーブルの列に、オブジェクトの属性を付ける

@FXML 
TableColumn<MyObject, CustomDate> myDateColumn; 

同じこと:

myDateColumn.setCellValueFactory(new PropertyValueFactory< MyObject, CustomDate>("myDateAttr")); 

そして最後に、明確さの揺れのために、これはあなたがオブジェクトクラスにゲッターを宣言する方法です:

public CustomDate getMyDateAttr() { 
    return new CustomDate(myDateAttr.getTime()); //myDateAttr is a java.util.Date   
} 

これは、舞台裏でjava.sql.Dateを使用しているため、これを把握するのに時間がかかりました。だからうまくいけば、これは他の人にしばらく時間を節約しますJava FX8のため

4

更新:

(java.timeパッケージのように、私はそれがその答えのために良い場所ですわからないんだけど、私はJavaFX8で問題を取得し、いくつかのものは変更されている)

以前の回答とのいくつかの違い: 私は列に日付の型を保持しているので、cellValueFactoryとcellFactoryの両方を使用する必要があります。 Iすべての日付列に対してcellFactoryを生成する汎用の再利用可能なメソッドを作成します。 java.timeパッケージのjava 8の日付を使用しています!しかし、このメソッドはjava.util.dateに対して簡単に再実装できます。

@FXML 
private TableColumn<MyBeanUi, ZonedDateTime> dateColumn; 

@FXML 
public void initialize() { 
    // The normal binding to column 
    dateColumn.setCellValueFactory(cellData -> cellData.getValue().getCreationDate()); 

    //.. All the table initialisation and then 
    DateTimeFormatter format = DateTimeFormatter .ofLocalizedDate(FormatStyle.SHORT); 
    dateColumn.setCellFactory (getDateCell(format)); 

} 

public static <ROW,T extends Temporal> Callback<TableColumn<ROW, T>, TableCell<ROW, T>> getDateCell (DateTimeFormatter format) { 
    return column -> { 
    return new TableCell<ROW, T>() { 
     @Override 
     protected void updateItem (T item, boolean empty) { 
     super.updateItem (item, empty); 
     if (item == null || empty) { 
      setText (null); 
     } 
     else { 
      setText (format.format (item)); 
     } 
     } 
    }; 
    }; 
} 

利点があることです:列が@Jordan

  • 方法をevoquedソートの問題を回避するために、「java8日」と入力される「getDateCellは」一般的であるとすることができ

  • 4

    java.text.Formatという再利用可能な列フォーマッタを作成するには、Javaジェネリックを使用することをお勧めします。これは、定型的なコードの量が削減...使い方の

    private class ColumnFormatter<S, T> implements Callback<TableColumn<S, T>, TableCell<S, T>> { 
        private Format format; 
    
        public ColumnFormatter(Format format) { 
         super(); 
         this.format = format; 
        } 
        @Override 
        public TableCell<S, T> call(TableColumn<S, T> arg0) { 
         return new TableCell<S, T>() { 
          @Override 
          protected void updateItem(T item, boolean empty) { 
           super.updateItem(item, empty); 
           if (item == null || empty) { 
            setGraphic(null); 
           } else { 
            setGraphic(new Label(format.format(item))); 
           } 
          } 
         }; 
        } 
    } 
    

    birthday.setCellFactory(new ColumnFormatter<Person, Date>(new SimpleDateFormat("dd MMM YYYY"))); 
    amplitude.setCellFactory(new ColumnFormatter<Levels, Double>(new DecimalFormat("0.0dB"))); 
    
    2

    これは私がやったと私は完全に働きました。

    import javafx.scene.control.TableCell; 
    import javafx.scene.control.TableColumn; 
    import javafx.util.Callback; 
    
    public interface AbstractConvertCellFactory<E, T> extends Callback<TableColumn<E, T>, TableCell<E, T>> { 
    
        @Override 
        default TableCell<E, T> call(TableColumn<E, T> param) { 
         return new TableCell<E, T>() { 
          @Override 
          protected void updateItem(T item, boolean empty) { 
           super.updateItem(item, empty); 
           if (item == null || empty) { 
            setText(null); 
           } else { 
            setText(convert(item)); 
           } 
          } 
         }; 
        } 
    
        String convert(T value);   
    } 
    

    とその使用例:

    TableColumn<Person, Timestamp> dateCol = new TableColumn<>("employment date"); 
    dateCol.setCellValueFactory(new PropertyValueFactory<>("emploumentDateTime"));  
    dateCol.setCellFactory((AbstractConvertCellFactory<Person, Timestamp>) value -> new SimpleDateFormat("dd-MM-yyyy").format(value)); 
    
    1

    ユニバーサルソリューションは、そのような単純なものでした間に

    //from my model 
        ObjectProperty<Date> valutaProperty; 
    
        //from my view 
        TableColumn<Posting, String> valutaColumn; 
    
        valutaColumn.setCellValueFactory(
          cellData -> { 
            SimpleStringProperty property = new SimpleStringProperty(); 
            property.bindBidirectional(cellData.getValue().valutaProperty, new SimpleDateFormat("dd.MM.yyyy", Locale.GERMAN)); 
            return property; 
           }); 
    
    0

    あなたは異なったタイプの簡単パイプのプロパティとは、フォーマッタやコンバータを置くことができる

    tbColDataMovt.setCellFactory((TableColumn<Auditoria, Timestamp> column) -> { 
        return new TableCell<Auditoria, Timestamp>() { 
         @Override 
         protected void updateItem(Timestamp item, boolean empty) { 
          super.updateItem(item, empty); 
          if (item == null || empty) { 
           setText(null); 
          } else { 
           setText(item.toLocalDateTime().format(DateTimeFormatter.ofPattern("dd/MM/yyyy"))); 
          } 
         } 
        }; 
    });