JavaFX可编辑的TableCell for Double属性

Iva*_*rov 2 java tableview tablecell tablecolumn javafx-8

如何为TableCell设置转换器以能够编辑Double属性?

<TableColumn fx:id="priceCol" text="Price">
  <cellValueFactory>
    <PropertyValueFactory property="price" />
  </cellValueFactory>
  <cellFactory>
    <TextFieldTableCell fx:factory="forTableColumn">
      <converter>
      // ???
      </converter>
    </TextFieldTableCell>
  </cellFactory>
</TableColumn>
Run Code Online (Sandbox Code Playgroud)

在哪里可以找到有关如何使用FXML设置此类文档的文档?到目前为止,这看起来确实令人困惑。

Jam*_*s_D 5

据我所知,在FXML中无法做到这一点。

cellFactory您提供的TableColumn是一个工厂:其类型Callback<TableColumn<?,?>,TableCell<?,?>>。静态工厂方法的调用返回的对象是这种类型的对象TextFieldTableCell.forTableColumn(),它是FXMLLoader根据元素创建的对象<TextFieldTableCell fx:factory="forTableColumn">

您提供的FXML代码会尝试setConverter(...)对所返回的对象进行调用TextFieldTableCell.forTableColumn(),并且当然Callback不会定义setConverter(...)方法,因此无论您将其作为子标记包含在内<converter>都无法正常工作。

据我所知,FXML中没有任何方法可以为通过调用的工厂方法提供参数fx:factory(这是我认为的目的),因此我认为您必须在控制器中执行此操作。

当然,后者非常容易。做就是了

<TableColumn fx:id="priceCol" text="Price">
  <cellValueFactory>
    <PropertyValueFactory property="price" />
  </cellValueFactory>
</TableColumn>
Run Code Online (Sandbox Code Playgroud)

在FXML和您的控制器中

public void initialize() {
    priceCol.setCellFactory(TextFieldTableCell.forTableColumn(new DoubleStringConverter()));
}
Run Code Online (Sandbox Code Playgroud)