JavaFX的表格单元格的格式(JavaFX Table Cell Formatting)

2019-06-26 04:30发布

    TableColumn<Event,Date> releaseTime  = new TableColumn<>("Release Time");
    releaseTime.setCellValueFactory(
                new PropertyValueFactory<Event,Date>("releaseTime")
            );

我怎样才能改变releaseTime的格式? 目前,它调用Date对象上一个简单的toString。

Answer 1:

你可以完成,通过细胞工厂。 看到
https://stackoverflow.com/a/10149050/682495
https://stackoverflow.com/a/10700642/682495
虽然第二连杆约ListCell ,同样的逻辑是完全适用于TableCell太迟了。

PS不过,如果你需要一些示例代码,请将附加在这里。



Answer 2:

如果您想保留您的TableColumn中的排序功能,没有一个解决方案上面是有效的:如果你转换您的日期为字符串,并显示在您的TableView这种方式; 该表将其排序作为这样(因此不正确地)。

我发现该溶液继承Date类以覆盖toString()方法。 有一个警告这里虽然:在使用的TableView代替java.sql.Date java.util.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);
    }
}

该表将调用以打印日期该方法。

当然,您需要更改太贵Date类中的TableColumn声明新的子类:

@FXML
TableColumn<MyObject, CustomDate> myDateColumn;

当您将您的对象属性到表的列同样的事情:

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

最后,为了清楚的震动,这是你如何在你的对象类声明的getter:

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

我花了一段时间来弄清楚这是由于它使用java.sql.Date幕后的事实; 所以希望这将节省别人一些时间!



Answer 3:

我建议使用Java泛型来创建可重用列格式化程序采取任何java.text.Format 。 这减少了样板代码量...

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


Answer 4:

我需要最近做到这一点 -

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发布神谕!



Answer 5:

更新Java的FX8:

(我不知道它是这个问题的答案的好地方,但我在JavaFX8得到了问题,有些事情已经改变,像java.time包)

与以前的答案一定的差异:我一直在列中的日期类型,所以我需要同时使用cellValueFactory和cellFactory。 我做一个通用的可重复使用的方法来生成所有日期列cellFactory。 我用java 8日期java.time包! 但是,该方法可以很容易地重新实现了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));
        }
      }
    };
  };
}

优点是:

  • 列键入一个“java8日期”,以避免@Jordan evoqued排序问题
  • 方法“getDateCell”是通用的,可以用作所有Java8时间类型的util的功能(本地分区等)


Answer 6:

这是我做的,我的工作完美。

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


Answer 7:

一个通用的解决方案可能是如此简单:

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


Answer 8:

您可以在不同类型的易管性能,并把格式化或转换器之间。

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


文章来源: JavaFX Table Cell Formatting