JavaFX 8 TableView过滤

问题描述:

我阅读这篇文章: http://code.makery.ch/blog/javafx-8-tableview-sorting-filtering/ 但我有问题,包含长的值不是字符串的列。JavaFX 8 TableView过滤

@FXML 
private TableView<Person> personTable; 
@FXML 
private TableColumn<Person, String> firstNameColumn; 
@FXML 
private TableColumn<Person, Long> lastNameColumn; 

@FXML 
private void initialize() { 
    // 0. Initialize the columns. 
    firstNameColumn.setCellValueFactory((TableColumn.CellDataFeatures<Person, String> cellData) -> { 
     return cellData.getValue().firstNameProperty(); 
    }); 

    firstNameColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Person, String>, 
      ObservableValue<String>>() { 
     @Override 
     public ObservableValue<String> call(TableColumn.CellDataFeatures<Person, String> param) { 
      return new SimpleStringProperty("str"); // HERE IS OK 
     } 
    }); 

lastNameColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Person, Long>, ObservableValue<Long>>() { 
    @Override 
    public ObservableValue<Long> call(TableColumn.CellDataFeatures<Person, Long> param) { 
     return new SimpleLongProperty(14L); // HERE IS WRONG 
     // Incompatible types. 
     // Required: ObservableValue<java.lang.Long> 
     // Found: SimpleLongProperty 
    } 
}); 

我写在代码中的错误。

任何人都知道,我做错了什么?

谢谢。

有些违反直觉,LongProperty实施ObservableValue<Number>,而不是ObservableValue<Long>。最简单的修复,它是否适合你的要求,将是使您的TableColumn类型Number

@FXML 
private TableColumn<Person, Number> lastNameColumn; 

lastNameColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Person, Number>, ObservableValue<Number>>() { 
    @Override 
    public ObservableValue<Number> call(TableColumn.CellDataFeatures<Person, Number> param) { 
     return new SimpleLongProperty(14L); 

    } 
}); 

如果你真的需要列类型为Long,那么你将需要做

lastNameColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Person, Long>, ObservableValue<Long>>() { 
    @Override 
    public ObservableValue<Long> call(TableColumn.CellDataFeatures<Person, Long> param) { 
     return new SimpleObjectProperty<Long>(14L); 

    } 
});