在TableView中编辑数字单元格

Ste*_*eve 7 java javafx tableview

我有一个TableView控件,它由几个包含Strings和Numbers的不同类型的列组成.我一直在尝试为可编辑的Number单元格编写一个合适的回调函数,但是由于我遇到了从空单元格到异常的各种问题,我无法使用它.

我已阅读http://docs.oracle.com/javafx/2/ui_controls/table-view.htm,但这仅涵盖单元格中的字符串值.关键点似乎是lastNameCol.setCellFactory(TextFieldTableCell.forTableColumn());.此行似乎是为文本字段而不是为数字字段定制的.

此外,我希望对输入的数字进行验证.这是否需要自定义回调CellFactory才能执行此操作?如果是这样,我如何开发一个接受Number类型并验证它们的回调?

这是我目前在项目中的代码片段:

@FXML private TableView<BMIRecord> fxBMITable;
@FXML private TableColumn<BMIRecord, String> fxBMITableDate;
@FXML private TableColumn<BMIRecord, String> fxBMITableTime;
@FXML private TableColumn<BMIRecord, Number> fxBMITableHeight;
@FXML private TableColumn<BMIRecord, Number> fxBMITableWeight;
@FXML private TableColumn<BMIRecord, Number> fxBMITableBMI;

// ...

private void someFunc() {
    fxBMITable.setEditable(true);

    /* BMI table callback configuration */
    fxBMITableHeight.setCellValueFactory(new Callback<CellDataFeatures<BMIRecord, String>, ObservableValue<String>>() {
        public ObservableValue<String> call(CellDataFeatures<BMIRecord, String> p) {
            return new SimpleStringProperty(p.getValue().getDateString());
        }
    });

    /*
     * ERROR:
     * The method setCellFactory(Callback<TableColumn<BMIRecord,Number>,TableCell<BMIRecord,Number>>)
     * in the type TableColumn<BMIRecord,Number> is not applicable for the arguments
     * (Callback<TableColumn<Object,String>,TableCell<Object,String>>)
     */
    fxBMITableHeight.setCellFactory(TextFieldTableCell.forTableColumn());
    fxBMITableHeight.setOnEditCommit(new EventHandler<CellEditEvent<BMIRecord, Number>>() {
        @Override
        public void handle(CellEditEvent<BMIRecord, Number> t) {
            ((BMIRecord)t.getTableView().getItems().get(t.getTablePosition().getRow())).setHeight(t.getNewValue().doubleValue());
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助.

Knu*_*daa 14

TextFieldTableCell是类型参数化的,并且具有一个stringConverter属性,您可以使用该属性转换为String或您想要的类型.

尝试类似的东西:

TextFieldTableCell.<BMIRecord, Number>forTableColumn(new NumberStringConverter())
Run Code Online (Sandbox Code Playgroud)

NumberStringConverter有一些额外的构造函数用于指定格式,请参阅javadocs.

这是一个更完整的例子:

public class Person {

    public Person(String name0, int age0) {
        name = name0;
        age = age0;
    }
    public String name;
    public int age;
}        

TableView<Person> personTable = new TableView<>();

TableColumn<Person, Number> age = new TableColumn<>();

age.setCellValueFactory(new Callback<CellDataFeatures<Person, Number>, ObservableValue<Number>>() {
    @Override
    public ObservableValue<Number> call(CellDataFeatures<Person, Number> p) {
        return new SimpleIntegerProperty(p.getValue().age);
} 
});

age.setCellFactory(TextFieldTableCell.<Person, Number>forTableColumn(new NumberStringConverter()));
Run Code Online (Sandbox Code Playgroud)

但是,这并不能很好地工作,因为NumberStringConverter是如此,直言不讳,ParseException如果您碰巧在单元格中输入字符串而不是数字,它会简单地抛出一个.

但是,实现自己的字符串转换器应该相对简单,您也可以在其中进行一些简单的验证(例如,值应介于0和100之间).

  • 对不起,我的Java有点生疏(我使用Scala).我修复了语法. (2认同)