JavaFX TableView可以部分编辑吗?

4

我有一个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;
    }
}

我可以帮您进行翻译。这段文本涉及到IT技术,作者想要将其中一个部分设置为可编辑,另一个部分设置为不可编辑。作者尝试了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已经可以正常显示(当我没有初始化measuresColumn时)。
PPS:我还尝试过用“setOnEditStart”代替“setOnEditCommit”。 “setOnEditCommit”没有被调用,但在可编辑列中可以调用“setOnEditStart”。

1
请参考Oracle的TableView教程,其中实现了部分编辑的“在表格中编辑数据”部分。 - Uluk Biy
2个回答

7

您没有使用支持编辑的单元格工厂。您需要执行以下操作:

measureNumbersColumn.setCellFactory(TextFieldTableCell.forTableColumn()) 

这将使您的列使用TextFieldTableCell而不是默认的TableCellTextFieldTableCell支持编辑(查看源代码并查找startEdit方法)。

或者,如果您对TextFieldTableCell的行为不满意,可以编写自己的TableCell实现,并覆盖startEditcancelEditupdateItem方法。

measureNumbersColumn.setCellFactory(new Callback<TableColumn<GasRatioMeasureBean,String>, TableCell<GasRatioMeasureBean,String>>() {

    @Override
    public TableCell<GasRatioMeasureBean, String> call(
            TableColumn<GasRatioMeasureBean, String> arg0) {
        return MyOwnTableCell(); 
    }
});

4

这是在TableView中创建可编辑列的方法。

tblViewPerson.setEditable(true);

        // Making editable columns 
        // For ID

        tblColID.setCellFactory(TextFieldTableCell.forTableColumn());

        tblColID.setOnEditCommit(
            new EventHandler<CellEditEvent<Person, String>>() {
                public void handle(CellEditEvent<Person, String> t) {
                    ((Person) t.getTableView().getItems().get(
                        t.getTablePosition().getRow())
                        ).setId(t.getNewValue());
                }
            }
        );

setID是POJO类的方法吗? - viper
控制器类的方法,用于使表格列可编辑。 - Subhojit Das

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接