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之间).
| 归档时间: |
|
| 查看次数: |
11920 次 |
| 最近记录: |