我有一个拥有两列的JavaFX TableView。此表使用ObservableList gasRatioMeasures
作为其模型。
public class GasRatioMeasureBean {
private String number;
private String measure;
public String getNumber() {
return number;
}
public void setNumber(int number) {
this.number = "Measure" + (number + 1) + "(%)";
}
public String getMeasure() {
return measure;
}
public void setMeasure(String measure) {
this.measure = measure;
}
}
我想将其中一个设为可编辑而另一个不可编辑。
首先我尝试了FXML方式:
<TableView layoutX="24.0" layoutY="122.0" prefHeight="200.0" prefWidth="215.0" fx:id="measureTableView">
<columns>
<TableColumn editable="false" prefWidth="100.0" sortable="false" text="No" fx:id="measureNumbersColumn" />
<TableColumn editable="true" prefWidth="110.0" sortable="false" text="Measures" fx:id="measuresColumn" />
</columns>
</TableView>
但是这没用。该表始终无法编辑。
我也试过java方式:
private void initMeasuresTableView() {
measureNumbersColumn.setCellValueFactory(new PropertyValueFactory<GasRatioMeasureBean, String>("number"));
measureNumbersColumn.setEditable(false);
measuresColumn.setCellValueFactory(new PropertyValueFactory<GasRatioMeasureBean, String>("measure"));
measuresColumn.setOnEditCommit(
new EventHandler<CellEditEvent<GasRatioMeasureBean, String>>() {
public void handle(CellEditEvent<GasRatioMeasureBean, String> measure) {
((GasRatioMeasureBean) measure.getTableView().getItems().get(
measure.getTablePosition().getRow())
).setMeasure(measure.getNewValue());
}
}
);
measureTableView.setItems(gasRatioMeasures);
measureTableView.setEditable(true);
}
但这也不起作用。所有的表都不可编辑。
如果TableColumn具有editable
属性,则应该可以单独设置。
如果你知道我做错了什么,请帮助我。谢谢!
PS:列的measureNumbersColumn已经正常显示(当我没有初始化measureColumn时)。
PPS:我也试过而不是setOnEditCommit
setOnEditStart
。未调用setOnEditCommit
,但可以在可编辑列中调用setOnEditStart
。
答案 0 :(得分:5)
您没有使用支持编辑的单元工厂。你需要这样做:
measureNumbersColumn.setCellFactory(TextFieldTableCell.forTableColumn())
这会使您的专栏使用TextFieldTableCell
代替默认TableCell
。
TextFieldTableCell支持编辑(查看源代码并查找startEdit
方法)。
或者,如果您对TextFieldTableCell的行为不满意,可以编写自己的TableCell实现,并覆盖startEdit,cancelEdit和updateItem方法。
measureNumbersColumn.setCellFactory(new Callback<TableColumn<GasRatioMeasureBean,String>, TableCell<GasRatioMeasureBean,String>>() {
@Override
public TableCell<GasRatioMeasureBean, String> call(
TableColumn<GasRatioMeasureBean, String> arg0) {
return MyOwnTableCell();
}
});
答案 1 :(得分:3)
这是在TableView中创建可编辑列的方法。
tblViewPerson.setEditable(真);
HtmlAttributes